Arduino और Unity के साथ एक कस्टम गेम कंट्रोलर कैसे बनाएं

Arduino और Unity के साथ एक कस्टम गेम कंट्रोलर कैसे बनाएं

क्या आप कभी अपना खुद का गेम कंट्रोलर डिजाइन करना चाहते हैं? आपके विचार से यह आसान है!





इस लघु परियोजना में हम एकता गेम इंजन के साथ उपयोग करने के लिए एक साधारण कस्टम गेम नियंत्रक का निर्माण करेंगे। यह नियंत्रक एक Arduino Uno द्वारा संचालित होगा, हालांकि आप इस परियोजना के लिए भी कई विकल्पों में से एक का उपयोग कर सकते हैं। हम एक बुनियादी गेम भी बनाएंगे जहां आप गिरने वाली वस्तुओं से बचने और समय को धीमा करने के लिए अपने नियंत्रक का उपयोग करेंगे।





इस परियोजना के लिए आपको आवश्यकता होगी

  • Arduino या समान माइक्रोकंट्रोलर
  • 1 x 10k ओम रोकनेवाला
  • 1 एक्स क्षणिक स्विच
  • 1 एक्स पोटेंशियोमीटर
  • हुक-अप तार
  • एक ब्रेडबोर्ड
  • एकता खेल इंजन
  • यूनिटी एसेट स्टोर से यूनीडुइनो प्लगइन ()
  • पूरा प्रोजेक्ट कोड , यदि आप इसे लिखना नहीं चाहते हैं (इसमें Uniduino प्लगइन शामिल नहीं है)

इनमें से अधिकतर चीजें Arduino स्टार्टर किट में उपलब्ध हैं। यदि आपके पास स्टार्टर किट नहीं है तो अपने लिए सबसे अच्छा चुनने के लिए हमारी मार्गदर्शिका देखें।





आप अपने नियंत्रक को जितना चाहें उतना जटिल बना सकते हैं, हालांकि इस उदाहरण के लिए हम एक पोटेंशियोमीटर और एक बटन स्थापित करेंगे - एक साधारण आर्केड गेम को नियंत्रित करने के लिए एकदम सही।

अपने नियंत्रक को असेंबल करना

अपना ब्रेडबोर्ड और Arduino सेट करें जैसा कि नीचे दी गई छवि में दिखाया गया है। यह वही है जो हम अपने गेम कंट्रोलर के रूप में उपयोग करेंगे, हालाँकि आप लगभग उसी सेटअप का उपयोग कर सकते हैं जैसे a DIY मिडी नियंत्रक बहुत!



अपना Arduino तैयार करना

एक बार जब आपके पास सब कुछ तार-तार हो जाए, तो अपने Arduino को USB के माध्यम से कनेक्ट करें। Arduino Software IDE में हेड टू उपकरण > बोर्ड तथा उपकरण> पोर्ट यह चुनने के लिए कि आप किस माइक्रोकंट्रोलर और पोर्ट का उपयोग कर रहे हैं। Arduino IDE हमारे लिए आवश्यक स्केच के साथ आता है, और आप इसे नीचे पा सकते हैं फ़ाइल> उदाहरण> फर्मेटा> स्टैंडर्डफर्माटा . अपलोड पर क्लिक करें और आप जाने के लिए तैयार हो जाएंगे।

यदि आप Arduino के लिए नए हैं और आपका सिर थोड़ा पिघल रहा है, तो हमारी जाँच करें शुरुआती मार्गदर्शक आपके कंप्यूटर के साथ अच्छी तरह से बात करने में आपकी मदद करने के लिए।





अपनी एकता परियोजना की स्थापना

एकता में, खुला विंडो > एसेट स्टोर एकता संपादक के भीतर से एकता के एसेट स्टोर तक पहुँचने के लिए। Uniduino प्लगइन के लिए एसेट स्टोर खोजें। यह प्लगइन आपको यूनिटी के अंदर अपने Arduino पिन से डेटा प्राप्त करने और भेजने की अनुमति देगा। लेखन के समय प्लगइन की कीमत है। हो सकता प्लगइन खरीदे बिना इस परियोजना को करने के लिए, हालांकि यह अधिक जटिल है और आपको प्लगइन अधिक सुविधाजनक लग सकता है।

प्लगइन के रचनाकारों का यह वीडियो आपको पहली बार सेटअप के साथ-साथ काम करने वाली हर चीज के परीक्षण की प्रक्रिया में ले जाता है। ध्यान दें कि आपको विंडोज़ पर एकता संपादक को भी रीसेट करना पड़ सकता है।





हम अपने नियंत्रक का परीक्षण करने के लिए इसी परीक्षण पैनल का उपयोग कर सकते हैं। पिन डी2 को इनपुट और डिजिटल पर सेट करें। और नीचे, पिन A5 को ANALOG पर सेट करें। आपके पोटेंशियोमीटर और बटन को अब उनके पिन नंबर के आगे स्क्रीन पर मान प्रदर्शित करना चाहिए। प्रगति!

अब कुछ ऐसा बनाने के लिए जिसे हम नियंत्रित कर सकते हैं

तो हमारे पास एक नियंत्रक है, लेकिन हम क्या नियंत्रित करेंगे? खैर, संभावनाएं अनंत हैं, लेकिन आज के लिए हम अपनी नई नियंत्रण प्रणाली का परीक्षण करने के लिए एक बहुत ही सरल चकमा देने वाला खेल बनाएंगे। हम गेम सेटअप को बहुत तेज़ी से आगे बढ़ाएंगे, इसलिए यदि आप यूनिटी इंजन के लिए पूरी तरह से नए हैं तो आप हमारे यूनिटी गेम प्रोग्रामिंग बिगिनर्स गाइड अपने बीयरिंग प्राप्त करने के लिए उपयोगी।

हम एक बहुत ही बुनियादी खेल का निर्माण करेंगे जिसमें आपका लक्ष्य अपने गोले को बाईं और दाईं ओर चकमा देना है ताकि गिरने वाले क्यूब्स से बचा जा सके, जो आपके नए बनाए गए कस्टम नियंत्रक का उपयोग करेगा।

एक नया दृश्य बनाएं और Uniduino प्रीफ़ैब को यहां से खींचें एसेट > Uniduino > प्रीफ़ैब्स अपने पदानुक्रम में और Uniduino प्रीफ़ैब को पदानुक्रम में खींचें। हमें अपने खेल और नियंत्रक के बीच बात करने के लिए वहां इसकी आवश्यकता है।

एकता पदानुक्रम में क्लिक करें बनाएँ> क्षेत्र और इसे गेम स्क्रीन के निचले भाग में ले जाने के लिए इंस्पेक्टर में ट्रांसफ़ॉर्म टैब का उपयोग करें।

यह कोडिंग प्राप्त करने का समय है

अब इस पार्टी में कुछ कोड जोड़ने के लिए। पदानुक्रम में चयनित क्षेत्र के साथ, क्लिक करें घटक जोड़ें > नई स्क्रिप्ट इसके इंस्पेक्टर विंडो के नीचे। नाम लो स्फीयरमूवर और चुनें सी तेज ड्रॉप डाउन मेनू से। क्लिक बनाएं और जोड़ें और स्क्रिप्ट को GameObject में जोड़ दिया जाएगा। स्क्रिप्ट खोलने के लिए उस पर डबल-क्लिक करें और यह कोड दर्ज करें:

using UnityEngine;
using System.Collections;
using Uniduino;
public class sphereMover : MonoBehaviour
{
//Headers aren't scrictly neccesary, but they make life easier back in the Inspector.
[Header('Arduino Variables')]
//we need to declare the Arduino as a variable
public Arduino arduino;
//we need to declare an integer for the pin number of our potentiometer,
//making these variables public means we can change them in the editor later
//if we change the layout of our arduino
public int potPinNumber;
//a float variable to hold the potentiometer value (0 - 1023)
public float potValue;
//we will later remap that potValue to the y position of our capsule and hold it in this variable
public float mappedPot;
//public int for our button pin
public int buttonPinNumber;
[Header('Sphere Variables')]
//variables to hold the values we noted earlier for the sides of our screen
public float leftEdge;
public float rightEdge;
// Use this for initialization
void Start ()
{//and initialize we shall, starting with the Arduino Variable.
//we are only using one arduino, so we can use Arduino.global to grab it.
arduino = Arduino.global;
arduino.Setup(ConfigurePins);
}
void ConfigurePins()
{
//configure the Arduino pin to be analog for our potentiometer
arduino.pinMode(potPinNumber, PinMode.ANALOG);
//Tell the Arduino to report any changes in the value of our potentiometer
arduino.reportAnalog(5, 1);
//configure our Button pin
arduino.pinMode(buttonPinNumber, PinMode.INPUT);
arduino.reportDigital((byte)(buttonPinNumber / 8), 1);
}
}

कोड टिप्पणियों के माध्यम से पढ़ने के लिए कुछ समय निकालें। अब तक, हमने अपने Arduino, उसके पिन और हमारे क्षेत्र के लिए कुछ चर घोषित किए हैं। हमने भी इस्तेमाल किया है

रन टाइम पर हमारे Arduino को इनिशियलाइज़ करने के लिए पिन विधियों को प्रारंभ और कॉन्फ़िगर करें। आइए अपनी स्क्रिप्ट को सहेजें, और एकता संपादक में वापस जाएं और देखें कि क्या बदला है।

अब हम अपने सार्वजनिक चर को निरीक्षक विंडो में देख सकते हैं। आइए देखें कि बाद में हमारी मदद करने के लिए हम इस स्तर पर क्या दर्ज कर सकते हैं। हम जानते हैं कि हम अपने निर्माण से पहले Arduino पर किस पिन का उपयोग कर रहे हैं, हम उन्हें दर्ज कर सकते हैं। हम अपने पहले के प्रयोग से यह भी जानते हैं कि हम चाहते हैं कि हमारा गोला बाएँ और दाएँ यात्रा करने में सक्षम हो ताकि यह स्क्रीन से न गिरे। आइए अब इन मानों को दर्ज करें।

जीवन के पहले लक्षण

यह वास्तव में एकता संपादक के अंदर हमारे Arduino के मूल्यों को देखने का समय है। अभी के लिए, हम अपने sphereMover स्क्रिप्ट के अपडेट फ़ंक्शन में कोड की एक पंक्ति जोड़ सकते हैं, और स्क्रिप्ट को फिर से सहेज सकते हैं।

void Update ()
{
//We assign the value the arduino is reading from our potentionmeter to our potValue variable
potValue = arduino.analogRead(potPinNumber);
}

अब जब हमारे पास हमारे पॉटवैल्यू वैरिएबल को हर फ्रेम में अपडेट किया जा रहा है, तो हम यूनिटी इंस्पेक्टर में वास्तविक समय में इसका मूल्य देख सकते हैं। इससे पहले कि हम इसका परीक्षण करें, अब यह जांचने का एक अच्छा समय होगा कि यूनीडुइनो प्लग इन सही पोर्ट पर सुन रहा है। उत्तराधिकार में Uniduino पर क्लिक करें, और निरीक्षक में इसका पोर्ट नाम जांचें। यदि यह खाली है, तो अपने Arduino के लिए सही पोर्ट नंबर भरें। इस मामले में यह COM4 था, हालांकि यह आपके लिए अलग हो सकता है। यदि आप सुनिश्चित नहीं हैं तो Arduino IDE का उपयोग करके जांचें।

पदानुक्रम में अपने क्षेत्र का चयन करें और स्क्रीन के शीर्ष पर स्थित प्ले बटन पर क्लिक करें। सिस्टम को आरंभ करने के लिए कुछ सेकंड की आवश्यकता होती है, जिसके बाद जब आप पोटेंशियोमीटर को घुमाते हैं तो आपको निरीक्षक में पॉट वैल्यू परिवर्तनशील परिवर्तन देखना शुरू कर देना चाहिए।

अभी हम बातें कर रहे हैं! ठीक है, कड़ाई से बोलते हुए एकता और अरुडिनो बात कर रहे हैं, लेकिन कौन गिन रहा है? यदि आप इसे प्राप्त कर चुके हैं और निरीक्षक में मूल्य परिवर्तन नहीं देख रहे हैं, तो सेटअप चरणों की जांच करें, और सुनिश्चित करें कि आपके पास अपने Arduino के लिए सही पोर्ट चुना गया है।

आइए इस गोले को आगे बढ़ाएं

अब जब हमारे पास पॉटवैल्यू वेरिएबल अपडेट किया जा रहा है, तो हम अपने क्षेत्र को स्थानांतरित करने के लिए इस मान का उपयोग करना चाहते हैं। जब पोटेंशियोमीटर बाईं ओर होता है तो हम चाहते हैं कि गोला स्क्रीन के बाईं ओर हो, और इसके विपरीत। यूनिटी में ऑब्जेक्ट वेक्टर स्पेस में एक बिंदु पर स्थित होते हैं, जो इसके मूल्यों द्वारा निर्धारित होते हैं परिवर्तन। स्थिति . नीचे की छवि में, जहां गोला बाईं ओर सबसे दूर के बिंदु पर है, हम इसे चाहते हैं, आप देख सकते हैं कि इसकी स्थिति वेक्टर 9.5, -4, 0 है।

हम गोले की X स्थिति को प्रभावित करना चाहते हैं। दुर्भाग्य से हमारे पोटेंशियोमीटर से मूल्यों का सीधे उपयोग करने से काम नहीं चलेगा, क्योंकि जब पोटेंशियोमीटर बाईं ओर होता है तो यह 0 का मान देता है - जो हमारे गोले को स्क्रीन के ठीक बीच में रखेगा। दूसरे छोर पर, पोटेंशियोमीटर का शीर्ष मान, 1023, क्यूब को हमारी स्क्रीन के दाईं ओर बंद कर देगा। उपयोगी नहीं। हमें यहां जो चाहिए वह कुछ गणित है।

गणित क्यों करें जब एकता आपके लिए करेगी?

आप में से उन लोगों के लिए जो निरर्थक संख्याओं में ढके कागज के एक टुकड़े को घूरते हुए डरते हैं (हालाँकि कुछ हैं) महान वेबसाइट जो आपको गणित सीखने में मदद कर सकता है), डरें नहीं। हमें अपने क्षेत्र की एक्स स्थिति के अनुरूप हमारे पोटेंशियोमीटर मानों को बनाने का एक तरीका चाहिए। सौभाग्य से, हम a use का उपयोग कर सकते हैं विस्तार विधि .

एक विस्तार विधि एक स्क्रिप्ट है जो हमारे लिए एक विशिष्ट कार्य करती है। इस मामले में, हम इसे हमारे पास मौजूद मान देते हैं, और यह उन्हें एक दूसरे के लिए मैप किया हुआ लौटाता है, जो हमारे उपयोग के लिए तैयार है स्फीयरमूवर लिपि। प्रोजेक्ट पैनल के शीर्ष पर, क्लिक करें बनाएँ> सी # स्क्रिप्ट और इसे एक्सटेंशन मेथड्स नाम दें। नीचे दिए गए कोड को स्क्रिप्ट में दर्ज करें:

using UnityEngine;
using System.Collections;
public static class ExtensionMethods {

//our handy dandy Remapper function
public static float Remap (this float value, float from1, float to1, float from2, float to2)
{
return (value - from1) / (to1 - from1) * (to2 - from2) + from2;
}
}

स्क्रिप्ट सहेजें, और अपने sphereMover स्क्रिप्ट पर वापस जाएं। अब हम अपने पोटेंशियोमीटर मानों को अपने गेम में उपयोग करने योग्य मानों में बदलने के लिए अपने अपडेट फ़ंक्शन में इस रीमैप फ़ंक्शन का उपयोग अपने एक्सटेंशनमेथड्स स्क्रिप्ट में कर सकते हैं। जहाँ हमने अभी-अभी potValue वैरिएबल असाइन किया है, वहाँ निम्न टाइप करें:

प्रॉम्प्ट हमें दिखाता है कि हमारा रीमैप फ्रॉम और टू वैल्यू के दो सेट लेता है, और उन्हें एक साथ मैप करता है। हम इसमें अपने मूल्यों को दर्ज कर सकते हैं।

mappedPot = potValue.Remap(0, 1023, leftEdge, rightEdge);

अपनी स्क्रिप्ट सहेजें, एकता संपादक पर वापस जाएं, और प्ले बटन दबाएं। अब आपको यह देखना चाहिए कि जब आप पोटेंशियोमीटर को घुमाते हैं, तो मैप किए गए पॉट चर बदल जाते हैं, हमारे द्वारा अपने बाएँ और दाएँ किनारों के लिए निर्धारित मानों के अनुरूप होने के लिए। वापस बैठने के लिए कुछ समय निकालें और अपनी ExtensionMethods स्क्रिप्ट को धन्यवाद दें। देखने में कैलकुलेटर नहीं।

नोट: यदि आप देख रहे हैं कि आपके मान उलट गए हैं, इसलिए जब आपका पोटेंशियोमीटर दाईं ओर है, तो आपको अपने मैप किए गए पॉट वैरिएबल के लिए एक नकारात्मक मान मिल रहा है, तो हो सकता है कि आपने अपना पोटेंशियोमीटर गलत तरीके से सेट किया हो। सौभाग्य से, आप बिना किसी रीवायरिंग के इसे ठीक कर सकते हैं। जब आप उन्हें रीमैप करते हैं तो आप केवल मानों को स्विच कर सकते हैं:

अब हमारे पास अंत में प्रयोग करने योग्य मूल्य हैं। अब जो कुछ करना बाकी है, वह उन मानों को हमारे क्षेत्र की X स्थिति में निर्दिष्ट करना है:

एसएसडी और एचडीडी का एक साथ उपयोग कैसे करें
//Assign the mapped pot value to the sphere's x position
transform.position = new Vector3(mappedPot, transform.position.y, transform.position.z);

अपनी स्क्रिप्ट सहेजें, एकता संपादक पर वापस जाएं और प्ले दबाएं। अब आप अपने पोटेंशियोमीटर का उपयोग करके अपने क्षेत्र को बाएँ और दाएँ घुमाने में सक्षम होना चाहिए!

बटन को काम पर रखना

अब जब हमारे पास अपना क्षेत्र चल रहा है, तो क्या यह अच्छा नहीं होगा कि जब हम तंग जगह पर पहुंचें तो चीजों को थोड़ा धीमा कर दें? हम अपने खेल में समय को धीमा करने के लिए अपने बटन का उपयोग करने जा रहे हैं। अपनी sphereMover स्क्रिप्ट खोलें, और इस कोड को अपने अपडेट फ़ंक्शन में जोड़ें

//if Unity detects the button is being pressed, the time scale slows down
if (arduino.digitalRead(buttonPinNumber) == 1){
Time.timeScale = 0.4f;
}
else Time.timeScale = 1.0f;

अब हमारे पास हमारे खेल के यांत्रिकी हैं, आइए कुछ बाधाओं को जोड़ें! हम गोले के प्राकृतिक शत्रु, घन का उपयोग करने जा रहे हैं। पदानुक्रम में, क्लिक करें बनाएं> 3डी ऑब्जेक्ट> क्यूब . घन के निरीक्षक में, घटक जोड़ें> भौतिकी> कठोर शरीर . रिगिडबॉडी के ड्रैग वैल्यू को 5 पर सेट करें। इसके अलावा, इंस्पेक्टर में बॉक्स कोलाइडर घटक के तहत, ट्रिगर है चुनें। यह हमें अपने क्षेत्र के साथ टकराव का पता लगाने की अनुमति देगा।

क्यूब पर एक स्क्रिप्ट बनाएं और उसे कॉल करें टकराने के साथ क्षेत्र , स्क्रिप्ट खोलें और स्टार्ट और अपडेट फ़ंक्शन को हटा दें क्योंकि इस बार हमें उनकी आवश्यकता नहीं होगी। यह कोड दर्ज करें:

using UnityEngine;
using System.Collections;
public class collideWithSphere : MonoBehaviour
{
void OnTriggerEnter(Collider other)
{
Destroy(other.gameObject);
}
}

जब भी ट्रिगर कोलाइडर दूसरे कोलाइडर से टकराता है तो OnTriggerEnter एक संदेश भेजता है। इस उदाहरण में, हम इसे जो कुछ भी छूते हैं उसे नष्ट करने के लिए कह रहे हैं। स्क्रिप्ट को सहेजें और एकता संपादक पर वापस जाएं। क्यूब को पदानुक्रम से प्रोजेक्ट पैनल में खींचें। आप देखेंगे कि पदानुक्रम में घन का पाठ नीला हो गया है। ऐसा इसलिए है क्योंकि हमने एक प्रीफ़ैब बनाया है और इसे अपने प्रोजेक्ट में सहेजा है। अपने घन को अब पदानुक्रम से हटा दें।

अब हमें केवल क्यूब्स को स्पॉन करने के लिए एक स्क्रिप्ट की आवश्यकता है। पदानुक्रम में क्लिक करें बनाएं> खाली बनाएं , और इसका नाम बदलकर इंस्पेक्टर में गेम मैनेजर कर दें और इसमें एक स्क्रिप्ट जोड़ें जिसे गेममैनेजर कहा जाता है। स्क्रिप्ट खोलें और यह कोड जोड़ें:

using UnityEngine;
using System.Collections;
public class gameManager : MonoBehaviour {
//a variable to hold the prefab we want to spawn
public GameObject cube;
//we want some variables to decide how any cubes to spawn
//and how high above us we want them to spawn
public int numberToSpwan;
public float lowestSpawnheight;
public float highestSpawnheight;
// Use this for initialization
void Start ()
{
for (int i = 0; i {
Instantiate(cube, new Vector3(Random.Range(-9, 9), Random.Range(lowestSpawnheight, highestSpawnheight), 0), Quaternion.identity);
}
}

// Update is called once per frame
void Update ()
{

}
}

स्क्रिप्ट को सेव करें। संपादक में वापस, पदानुक्रम में गेम मैनेजर का चयन करें, और अपने क्यूब प्रीफ़ैब को प्रोजेक्ट पैनल से इंस्पेक्टर में क्यूब वैरिएबल पर खींचें। यहां अपने स्पॉनिंग के लिए मान भी भरें। आप इसे जितना चाहें उतना कठिन या आसान बनाने के लिए इसके साथ फील कर सकते हैं। ध्यान दें कि यूनीडुइनो को इनिशियलाइज़ करने की अनुमति देने के लिए आपके सबसे कम क्यूब काफी ऊंचे स्पॉन के लायक हैं - इससे पहले कि आप आगे बढ़ने में सक्षम हों, गेम को खोना निराशाजनक हो सकता है!

समाप्त परियोजना

अब जब आप play दबाएंगे, तो क्यूब आपके ऊपर स्पॉन करेंगे और गिरेंगे। आप उनसे बचने के लिए अपने पोटेंशियोमीटर का और समय को धीमा करने के लिए अपने बटन का उपयोग कर सकते हैं।

इस प्रोजेक्ट में हमने एक Arduino के साथ एक कस्टम कंट्रोलर बनाया है, इसके साथ संवाद करने के लिए Unity और Uniduino को कॉन्फ़िगर किया है, और इसका परीक्षण करने के लिए एक सरल गेम बनाया है। यहां की अवधारणाएं लगभग किसी भी परियोजना पर लागू की जा सकती हैं, और यहां तक ​​​​कि हैं गेम जैम जो कस्टम नियंत्रकों के विशेषज्ञ हैं .

Arduino और Unity के साथ आप लगभग किसी भी चीज़ से एक कस्टम कंट्रोलर बना सकते हैं। क्या आपने एक हाई-फाई बनाया है जो अंतरिक्ष यान को नियंत्रित करता है? एक टोस्टर जो एक प्लेटफॉर्म गेम को नियंत्रित करता है?

यदि आपने इस तरह का कोई प्रोजेक्ट बनाया है तो मुझे इसे देखना अच्छा लगेगा! इसे नीचे टिप्पणियों में पोस्ट करें!

साझा करना साझा करना कलरव ईमेल 6 श्रव्य विकल्प: सर्वश्रेष्ठ मुफ्त या सस्ते ऑडियोबुक ऐप्स

यदि आप ऑडियो पुस्तकों के लिए भुगतान करना पसंद नहीं करते हैं, तो यहां कुछ बेहतरीन ऐप्स हैं जो आपको उन्हें निःशुल्क और कानूनी रूप से सुनने की सुविधा देते हैं।

आगे पढ़िए
संबंधित विषय
  • DIY
  • प्रोग्रामिंग
  • अरुडिनो
  • खेल नियंत्रक
  • खेल का विकास
लेखक के बारे में इयान बकले(२१६ लेख प्रकाशित)

इयान बकले बर्लिन, जर्मनी में रहने वाले एक स्वतंत्र पत्रकार, संगीतकार, कलाकार और वीडियो निर्माता हैं। जब वह लिख नहीं रहा होता है या मंच पर नहीं होता है, तो वह पागल वैज्ञानिक बनने की उम्मीद में DIY इलेक्ट्रॉनिक्स या कोड के साथ छेड़छाड़ कर रहा होता है।

इयान बकले की और फ़िल्में या टीवी शो

हमारे न्यूज़लेटर की सदस्यता लें

तकनीकी युक्तियों, समीक्षाओं, निःशुल्क ई-पुस्तकों और अनन्य सौदों के लिए हमारे न्यूज़लेटर से जुड़ें!

सब्सक्राइब करने के लिए यहां क्लिक करें
श्रेणी Diy