القائمة الرئيسية

الصفحات

Unity Game Engine: اكتشاف onCollisionEnter

Unity Game Engine: اكتشاف onCollisionEnter

Unity Game Engine: اكتشاف onCollisionEnter

في هذا المقال التعليمي ، سوف نتعلم كيفية اكتشاف التصادمات بين كائنين من
 ألعاب gameObjects باستخدام برنامج نصي بسيط #C  ،
 وكيفية تنفيذ بعض التعليمات البرمجية عند اصطدام الكائنات.
سنتعلم أيضًا كيفية التعامل مع علامات اللعبة وسبب أهميتها ، 
وسنتعلم أيضًا كيفية استخدام وحدة التحكم في Unity لإخراج 
رسائل مخصصة يمكن أن تكون مفيدة لنا كمطورين ومختبرين.
للبدء ، دعنا نفتح المشروع الذي كنا نعمل عليه حتى الآن:

Unity Game Engine: اكتشاف onCollisionEnter


يبدو أن كل شيء في النظام. الآن ، دعنا نضيف مصادم صندوقي ثنائي الأبعاد 
جديد إلى رصاصتنا (كرة نارية) حتى تتمكن من اكتشاف التصادمات
 (تذكر أن المصادم هو ما يحدد التصادم بالفعل ، وليس الجسم الصلب ).
هل تريد معرفة كيفية إضافة مصادم إلى كائن لعبة؟ سوف تجد هنا .



إليك سؤال سريع: إذا أردنا أن تحتوي جميع الرصاصات المولدة (الكرات النارية)
 على مصادم صندوقي ، فماذا نعدل؟ و الجاهزة بطبيعة الحال. إرفاق مصادم مربع
 ثنائي الأبعاد بالمصنع الجاهز ، وهذا يتعلق بالرصاصة.
الآن ، لنمنح شخصيتنا الرئيسية شيئًا لتصويره. ماذا عن الهدف؟ لدينا واحد هنا في مكان ما.
 دعنا نستورد هذا الهدف في مشروع لعبتنا وفي مشهدنا 
(يجب أن تكون مرتاحًا إلى حد ما بإضافة نقوش متحركة جديدة إلى المشهد الآن).

Unity Game Engine: اكتشاف onCollisionEnter


الآن ، دعنا نضيف مصادم دائري ثنائي الأبعاد إلى هدفنا 
(نظرًا لأنه دائرة ، بعد كل شيء) وكذلك  Rigidbody2D.


Unity Game Engine: اكتشاف onCollisionEnter




الآن ، دعنا نمضي قدمًا ونكتب بعض البرامج النصية لاكتشاف تصادم بين
الرصاصة (كرة نارية) والهدف. مرة أخرى ، انسخ الكود أدناه ، وسنشرح ما يحدث بالتفصيل:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TargetBehaviour : MonoBehaviour
{
    
    void onCollisionEnter2D(Collision2D col) 
    {
        // When target is hit
        if(col.gameObject.tag == "Bullet")
        {
            Debug.Log("Target was Hit!");
        }
    }

}


تذكر ، قلنا أن MonoBehaviour الفصل يوفر الكثير من
 الطرق الافتراضية الأخرى جنبًا إلى جنب 
()start و ()update؟ حسنًا ، ()OnCollisionEnter2D
(مع المعلمة Collision2D) هي إحدى هذه الطرق.
 إنها طريقة تطلقها Unity (تسمى) عندما تكتشف تصادمًا بين الكائن الذي
 يرتبط به هذا البرنامج النصي ، وأي كائن gameObject آخر.
لاحظ Collision2D col المعلمة التي قدمناها. 
(باستخدام اسم المتغير كما col أو coll غير شعبية كبيرة بين المطورين،
 وعند استخدام هذه الطريقة). 
لم نقم بتعيين أو حتى إنشاء مثيل لأي Collision2D كائن / متغير ، كيف نستخدمه؟
Collision2D هي مجموعة من البيانات حول التصادم الذي تم
 إنشاؤه أثناء تصادم بواسطة Unity . 
وهي تتضمن أشياء مثل كائن gameObject الذي تم ضربه ، والنقطة التي وصل إليها 
(تم تخزينها كمتغير Point وهو ، في الواقع ،  Vector3) وما إلى ذلك.
 col هو ببساطة الاسم الذي أطلقناه على هذه المجموعة من البيانات للتصادم.




ومن ثم سيتم استدعاء هذه الطريقة كلما تم اكتشاف تضارب ،
 وستتأكد Unity من أن الوسيطة col (مثيل Collision2D) تحتوي على
 جميع القيم المطلوبة المخزنة فيه. علينا فقط أن نستخدمها ونعمل عليها.
بعد ذلك ، ألق نظرة على الشرط في if البيان.


(col.gameObject.tag == "Bullet")


ماذا يعني هذا الخط؟ هذا يعني ببساطة أن كائن gameObject المتضمن
 في col متغير البيانات ، أي كائن gameObject الذي اصطدم ،
 يجب أن يحتوي على علامة باسم Bullet حتى يتم if إطلاق العبارة. 
 لما؟ لا تقلق بشأن العلامات حتى الآن ، فسنصل إلى ذلك قريبًا جدًا.

Unity Game Engine: اكتشاف onCollisionEnter

ما هذا Debug.Log ؟

السطر التالي مهم جدًا ، لأنه خطنا السحري و Debug الطبقة هي الطبقة التي 
تحتوي على الأدوات التي هي مفيدة جدا في حين أنك تستطيع تطوير اللعبة، 
وأكثر من ذلك عندما كنت اختبار رمز أو أي مكونات أخرى.
إحدى الطرق المدرجة في Debug الفصل هي
 Log(string parameter) الطريقة التي نستخدمها في الكود أعلاه. 
يقوم ببساطة بطباعة رسالة جديدة محددة بواسطة المعلمة إلى وحدة التحكم ، متى اتصلت بالطريقة.
 احفظ هذا البرنامج النصي وأرفقه بالهدف. تذكر أن تعيين الجاذبية مقياس
 لـ 0 في المحرر، وبالإضافة إلى ذلك، يجب تجميد X و Y الإحداثيات 
في القائمة القيود لمنع تستهدفها من التحليق بعيدا.



ما هي علامات اللعبة؟

قبل تشغيل اللعبة ، دعنا نعمل على العلامات. العلامات هي في الأساس طريقة
 لتحديد وتجميع كائنات gameObject معًا ، من أجلك أنت و Unity .
 افتراضيًا ، لا يتم تمييز كائنات gameObjects ، أي أنها لا تحتوي على أي علامة عليها. 
يمكننا تعيين العلامات وإنشاء العلامات الخاصة بنا ، من خلال النقر على
 خيار العلامة في الجزء العلوي من المراقب كائن اللعبة (أو الجاهزة):

Unity Game Engine: اكتشاف onCollisionEnter


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

Unity Game Engine: اكتشاف onCollisionEnter


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

Unity Game Engine: اكتشاف onCollisionEnter




إذا قمت بتشغيل اللعبة الآن ، فحاول إطلاق النار على الهدف ، وسترى شيئًا مثل هذا:

Unity Game Engine: اكتشاف onCollisionEnter


ألق نظرة على الزاوية اليسرى السفلية من نافذة Unity . 
يجب أن ترى رسالتك كلما أصابت رصاصتك الهدف. بالطبع ، الطريقة التي برمجنا بها 
الرصاصة للتحرك ، سوف تلمس الهدف وتستمر في التحرك إلى الأبد. 
سنقوم بإصلاح ذلك في المستقبل ، لذلك في الوقت الحالي ، 
سنركز على ما يحدث بالفعل هنا.
شخصيتنا الرئيسية تطلق رصاصة بالعلامة Bullet
بمجرد اكتشاف Unity تصادمًا مع الرمز النقطي باسم Bullet ، if يتحول
 البيان true ويتم تنفيذ الكود الذي يحتوي عليه.
يطلب الرمز من الوحدة الطباعة Target was hit ! إلى وحدة التحكم.
ملاحظة: يتكرر هذا في كل مرة تقوم فيها بإطلاق النار على الهدف.
إذا كنت تريد رؤية نافذة وحدة التحكم الكاملة ، حيث يمكنك أيضًا رؤية أخطاء البرمجة
 النصية والتحذيرات إذا اكتشفتها Unity ، فيمكنك العثور عليها بسهولة 
بالنقر فوق علامة التبويب وحدة التحكم أعلى قسم الأصول مباشرةً .


Unity Game Engine: اكتشاف onCollisionEnter

Unity Game Engine: اكتشاف onCollisionEnter

التدريب العملي

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

جدول المحتويات