كيفية صنع وحدة تحكم ألعاب مخصصة باستخدام Arduino و Unity

كيفية صنع وحدة تحكم ألعاب مخصصة باستخدام Arduino و Unity

هل سبق لك أن أردت تصميم وحدة التحكم في الألعاب الخاصة بك؟ وأسهل مما كنت اعتقد!





في هذا المشروع القصير ، سنبني وحدة تحكم لعبة مخصصة بسيطة لاستخدامها مع محرك لعبة Unity. سيتم تشغيل وحدة التحكم هذه بواسطة Arduino Uno ، على الرغم من أنه يمكنك استخدام أحد البدائل العديدة المتوفرة لهذا المشروع أيضًا. سننشئ أيضًا لعبة أساسية حيث ستستخدم وحدة التحكم الخاصة بك لتجنب سقوط الأشياء وإبطاء الوقت.





لهذا المشروع سوف تحتاج

  • اردوينو أو متحكم مماثل
  • 1 × 10 كيلو أوم المقاوم
  • 1 × مفتاح مؤقت
  • 1 × مقياس الجهد
  • أسلاك التوصيل
  • لوح التجارب
  • محرك لعبة الوحدة
  • المكون الإضافي Uniduino من Unity Asset Store (30 دولارًا)
  • أكمل كود المشروع ، في حالة عدم رغبتك في كتابته (لا يشمل البرنامج المساعد Uniduino)

تتوفر معظم هذه الأشياء في مجموعة أدوات Arduino للمبتدئين. إذا لم يكن لديك مجموعة أدوات بدء التشغيل ، فراجع دليلنا لاختيار أفضل مجموعة لك.





يمكنك جعل وحدة التحكم الخاصة بك معقدة كما يحلو لك ، على الرغم من أننا في هذا المثال سنقوم بإعداد مقياس جهد وزر - مثالي للتحكم في لعبة أركيد بسيطة.

تجميع وحدة التحكم الخاصة بك

قم بإعداد لوح التجارب و Arduino كما هو موضح في الصورة أدناه. هذا ما سنستخدمه كوحدة تحكم في اللعبة ، على الرغم من أنه يمكنك استخدام نفس الإعداد تمامًا مثل ملف تحكم ميدي DIY جدا!



تحضير بطاقة الأردوينو

بمجرد الانتهاء من توصيل كل شيء بالأسلاك ، قم بتوصيل Arduino عبر USB. في Arduino Software IDE توجه إلى أدوات> لوحة و أدوات> منفذ لتحديد أي وحدة تحكم ومنفذ تستخدمهما. يأتي Arduino IDE مرفقًا بالرسم الذي نحتاجه ، ويمكنك العثور عليه تحته ملف> أمثلة> Firmata> StandardFirmata . انقر فوق تحميل وستكون جاهزًا للانطلاق.

إذا كنت جديدًا على Arduino ورأسك يذوب قليلاً ، تحقق من دليل المبتدئين لمساعدتك على التحدث مع جهاز الكمبيوتر الخاص بك بشكل جيد.





إنشاء مشروع الوحدة الخاص بك

في الوحدة ، افتح نافذة> متجر الأصول للوصول إلى Unity's Asset Store من داخل Unity Editor. ابحث في Asset Store عن المكوِّن الإضافي Uniduino. سيسمح لك هذا المكون الإضافي بتلقي البيانات وإرسالها من وإلى دبابيس Arduino داخل Unity. تبلغ تكلفة المكون الإضافي وقت كتابة هذا التقرير 30 دولارًا. إنه ممكن للقيام بهذا المشروع دون شراء البرنامج المساعد ، على الرغم من أنه أكثر تعقيدًا إلى حد ما وقد تجد البرنامج المساعد أكثر ملاءمة من جميع النواحي.

يأخذك هذا الفيديو من منشئي المكون الإضافي خلال عملية اختبار كل شيء يعمل ، إلى جانب الإعداد لأول مرة. لاحظ أنه قد تضطر أيضًا إلى إعادة تعيين محرر Unity على Windows.





يمكننا استخدام نفس لوحة الاختبار هذه لاختبار وحدة التحكم الخاصة بنا. اضبط Pin D2 على INPUT و Digital. علاوة على ذلك ، قم بتعيين Pin A5 على ANALOG. يجب أن يعرض مقياس الجهد والزر القيم على الشاشة بجوار أرقام التعريف الخاصة بهم الآن. تقدم!

الآن لنصنع شيئًا يمكننا التحكم فيه

إذن لدينا وحدة تحكم ، ولكن ما الذي يجب أن نتحكم فيه؟ حسنًا ، الاحتمالات لا حصر لها ، ولكن اليوم سننشئ لعبة مراوغة بسيطة للغاية لاختبار نظام التحكم الجديد الخاص بنا. سننتقل إلى إعداد اللعبة بسرعة كبيرة ، لذلك إذا كنت جديدًا تمامًا على محرك Unity ، فقد تجد ما لدينا دليل Unity Game Programming Beginner's Guide مفيد للحصول على الاتجاهات الخاصة بك.

سنقوم ببناء لعبة أساسية للغاية هدفك فيها هو مراوغة الكرة إلى اليسار واليمين لتجنب سقوط المكعبات ، والتي ستستخدم وحدة التحكم المخصصة الجديدة الخاصة بك.

أنشئ مشهدًا جديدًا واسحب مبنى Uniduino الجاهز من الأصول> Uniduino> المباني الجاهزة إلى الهيكل الهرمي واسحب مبنى Uniduino الجاهز إلى التسلسل الهرمي. نحتاجها هناك لإجراء الحديث بين لعبتنا ووحدة التحكم.

في التسلسل الهرمي للوحدة ، انقر فوق إنشاء> Sphere واستخدم علامة التبويب التحويل في المفتش لنقلها إلى أسفل شاشة اللعبة.

حان الوقت للحصول على الترميز

الآن لإضافة بعض التعليمات البرمجية لهذه الحفلة. مع تحديد الكرة في التسلسل الهرمي ، انقر فوق إضافة مكون> برنامج نصي جديد في الجزء السفلي من نافذة المفتش. أطلق عليه اسما sphereMover واختر ج شارب من القائمة المنسدلة. انقر إنشاء وإضافة وستتم إضافة البرنامج النصي إلى 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 ودبابيسه ومجالنا الكروي. لقد استخدمنا أيضًا ملف

طرق البدء و ConfigurePins لتهيئة 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);
}

الآن بعد أن تم تحديث متغير potValue الخاص بنا في كل إطار ، يمكننا أن نرى قيمته في الوقت الفعلي في Unity Inspector. قبل أن نجريها اختبارًا ، سيكون الآن هو الوقت المناسب للتحقق من أن المكون الإضافي Uniduino يستمع على المنفذ الصحيح. انقر فوق Uniduino في التسلسل الوراثي ، وتحقق من اسم المنفذ في المفتش. إذا كان فارغًا ، فقم بتعبئة رقم المنفذ الصحيح لـ Arduino الخاص بك. في هذه الحالة كان COM4 ، على الرغم من أنه قد يكون مختلفًا بالنسبة لك. تحقق من استخدام Arduino IDE إذا لم تكن متأكدًا.

حدد المجال الخاص بك في التسلسل الهرمي وانقر فوق الزر 'تشغيل' في الجزء العلوي من الشاشة. يحتاج النظام إلى بضع ثوانٍ للتهيئة ، وبعد ذلك يجب أن تبدأ في رؤية التغيير المتغير لقيمة وعاء في المفتش عند تحريك مقياس الجهد.

الآن نحن نتحدث! حسنًا ، بالمعنى الدقيق للكلمة ، يتحدث Unity و Arduino ، لكن من الذي يعد؟ إذا كنت قد وصلت إلى هذا الحد ولا ترى تغيير القيمة في المفتش ، فتحقق من خطوات الإعداد ، وتأكد من تحديد المنفذ الصحيح لـ Arduino الخاص بك.

لنحرك هذا المجال

الآن بعد أن قمنا بتحديث متغير potValue ، نريد استخدام هذه القيمة لتحريك المجال. عندما يكون مقياس الجهد على طول الطريق إلى اليسار ، نريد أن تكون الكرة في الجانب الأيسر من الشاشة ، والعكس صحيح. يتم وضع الكائنات في Unity عند نقطة في مساحة Vector ، ويتم تحديدها من خلال قيمها التحويل . في الصورة أدناه ، حيث تكون الكرة في أبعد نقطة إلى اليسار نريدها ، يمكنك أن ترى أن متجه الموضع هو 9.5 ، -4 ، 0.

نريد التأثير على موضع X للكرة. لسوء الحظ ، لن يعمل استخدام القيم من مقياس الجهد الخاص بنا مباشرة ، حيث أنه عندما يكون مقياس الجهد على طول الطريق إلى اليسار ، فإنه يعطي قيمة 0 - مما يضع الكرة في منتصف الشاشة. على الطرف الآخر ، فإن أعلى قيمة لمقياس الجهد ، 1023 ، ستضع طريق المكعب على يمين الشاشة. ليس مفيدا. ما نحتاجه هنا هو بعض الرياضيات.

لماذا الرياضيات عندما تفعل الوحدة لك؟

لأولئك منكم الذين يخافون من التحديق في قطعة من الورق مغطاة بأرقام لا معنى لها (على الرغم من وجود بعض مواقع رائعة يمكن أن تساعدك على تعلم الرياضيات) ، لا تخف. نحن بحاجة إلى طريقة لجعل قيم مقياس الجهد الخاص بنا تتوافق مع موضع الكرة X الخاص بنا. لحسن الحظ ، يمكننا استخدام ملف طريقة التمديد .

طريقة الامتداد هي برنامج نصي يقوم بعمل محدد لنا. في هذه الحالة ، نعطيها القيم التي لدينا ، ونعيدها إلى بعضها البعض ، لتكون جاهزة للاستخدام في sphereMover النصي. في الجزء العلوي من لوحة المشروع ، انقر فوق إنشاء> C # Script وأطلق عليها اسم ExtensionMethods. أدخل الرمز أدناه في البرنامج النصي:

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 الخاص بك. يمكننا الآن استخدام وظيفة Remap هذه في البرنامج النصي ExtensionMethods الخاص بنا في وظيفة التحديث الخاصة بنا لتحويل قيم مقياس الجهد إلى قيم قابلة للاستخدام في لعبتنا. أسفل حيث قمنا للتو بتعيين متغير potValue ، اكتب ما يلي:

يوضح لنا الموجه أن Remap الخاص بنا يأخذ مجموعتين من قيم From و To ، ويضعهما معًا. يمكننا إدخال قيمنا في هذا.

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

احفظ البرنامج النصي ، عد إلى محرر الوحدة ، واضغط على زر التشغيل. يجب أن ترى الآن أن متغير Mapped Pot يتغير عند تحريك مقياس الجهد ، ليتوافق مع القيم التي حددناها لحوافنا اليمنى واليسرى. خذ لحظة للجلوس وشكر النص البرمجي الخاص بـ ExtensionMethods. ليست آلة حاسبة في الأفق.

ملحوظة: إذا لاحظت أن قيمك معكوسة ، لذلك عندما يكون مقياس الجهد الخاص بك على طول الطريق إلى اليمين ، فإنك تحصل على قيمة سالبة لمتغير القدرة المحددة ، قد يكون لديك مقياس الجهد الخاص بك قد تم إعداده بطريقة خاطئة. لحسن الحظ ، يمكنك إصلاح هذا دون القيام بأي إعادة توصيل. يمكنك ببساطة تبديل القيم عند إعادة تعيينها:

الآن لدينا أخيرًا قيم قابلة للاستخدام. كل ما تبقى الآن هو تعيين هذه القيم لموضع X للكرة لدينا:

تطبيقات الموسيقى المجانية دون اتصال بالإنترنت لنظام Android
//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;

الآن لدينا آليات لعبتنا ، دعنا نضيف بعض العقبات! سنستخدم العدو الطبيعي للكرة ، المكعب. في التسلسل الهرمي ، انقر فوق إنشاء> كائن ثلاثي الأبعاد> مكعب . في مفتش المكعب ، أضف مكونًا> فيزياء> جسم صلب . عيّن قيمة السحب للجسم الصلب إلى 5. أيضًا ، ضمن مكون Box Collider في المفتش ، حدد Is Trigger. سيسمح لنا هذا باكتشاف الاصطدامات مع المجال الخاص بنا.

قم بإنشاء برنامج نصي على المكعب وقم بتسميته الاصطدام مع سفير ، افتح البرنامج النصي واحذف وظيفتي البدء والتحديث لأننا لن نحتاج إليهما هذه المرة. أدخل هذا الرمز:

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

OnTriggerEnter يرسل رسالة كلما اصطدم مصادم الزناد بمصادم آخر. في هذه الحالة ، نقول لها أن تدمر كل ما تلمسه. احفظ النص وارجع إلى محرر الوحدة. اسحب المكعب من التسلسل الهرمي إلى لوحة المشروع. ستلاحظ أن نص المكعب في التسلسل الهرمي قد تحول إلى اللون الأزرق. هذا لأننا أنشأنا مبنى جاهزًا وحفظناه في مشروعنا. احذف المكعب الخاص بك من التسلسل الهرمي الآن.

كل ما نحتاجه الآن هو برنامج نصي لتفرخ المكعبات. في التسلسل الهرمي ، انقر فوق إنشاء> إنشاء فارغ ، وأعد تسميته إلى Game Manager في المفتش وأضف نصًا إليه يسمى gameManager. افتح البرنامج النصي وأضف هذا الرمز:

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 ()
{

}
}

احفظ البرنامج النصي. مرة أخرى في المحرر ، حدد Game Manager في التسلسل الهرمي ، واسحب الهيكل المكعب الخاص بك من لوحة المشروع إلى متغير Cube في المفتش. املأ القيم الخاصة بالتكاثر هنا أيضًا. يمكنك العبث بها لجعلها صعبة أو سهلة كما تريد. لاحظ أنه من المفيد وضع مكعبات أقل ارتفاعًا بما يكفي للسماح لـ Uniduino بالبدء - فقد يكون خسارة اللعبة قبل أن تتمكن من التحرك أمرًا محبطًا!

المشروع المنتهي

الآن عندما تضغط على اللعب ، سوف تفرخ المكعبات فوقك وتسقط. يمكنك استخدام مقياس الجهد الخاص بك لتجنبها ، والزر الخاص بك لإبطاء الوقت.

في هذا المشروع ، أنشأنا وحدة تحكم مخصصة باستخدام Arduino ، وقمنا بتكوين Unity و Uniduino للتواصل معها ، وأنشأنا لعبة بسيطة لاختبارها. يمكن تطبيق المفاهيم هنا على أي مشروع تقريبًا ، بل هناك أيضًا لعبة المربى التي تتخصص في وحدات التحكم المخصصة .

باستخدام Arduino و Unity ، يمكنك إنشاء وحدة تحكم مخصصة من أي شيء تقريبًا. هل أنشأت هاي فاي يتحكم في مركبة فضائية؟ محمصة تتحكم في لعبة منصة؟

إذا كنت قد أنشأت مشروعًا كهذا ، فأنا أحب أن أراه! انشرها في التعليقات أدناه!

يشارك يشارك سقسقة بريد الالكتروني 6 بدائل مسموعة: أفضل تطبيقات الكتب الصوتية المجانية أو الرخيصة

إذا كنت لا ترغب في الدفع مقابل الكتب الصوتية ، فإليك بعض التطبيقات الرائعة التي تتيح لك الاستماع إليها مجانًا وبشكل قانوني.

اقرأ التالي
مواضيع ذات صلة
  • افعلها بنفسك
  • برمجة
  • اردوينو
  • تحكم اللعبة
  • تطوير اللعبة
نبذة عن الكاتب إيان باكلي(216 مقالة منشورة)

إيان باكلي صحفي مستقل وموسيقي وفنان ومنتج فيديو يعيش في برلين بألمانيا. عندما لا يكتب أو على خشبة المسرح ، فإنه يعبث بإلكترونيات أو رموز DIY على أمل أن يصبح عالمًا مجنونًا.

المزيد من Ian Buckley

اشترك في نشرتنا الإخبارية

انضم إلى النشرة الإخبارية لدينا للحصول على نصائح تقنية ومراجعات وكتب إلكترونية مجانية وصفقات حصرية!

انقر هنا للاشتراك