OnCollisionEnter
جزء من قسم الفيزياء وأسلوب اللعب في رحلة Unity على Coddy. الدرس 8 من 71.
عندما يبدأ مصادمان بالتلامس، تستدعي Unity الدالة OnCollisionEnter(Collision collision) في نصوص كلا الجسمين. تُستدعى مرة واحدة، في خطوة الفيزياء التي يبدأ فيها التلامس، ولا تُستدعى مجددًا ما داما متلامسين. لكي يحدث تصادم أصلًا، يجب أن يكون لدى أحد الجسمين على الأقل مكوّن Rigidbody تحرّكه الفيزياء: الجدار والأرضية اللذان لا يملكان Rigidbody لا يبلّغ أحدهما الآخر بأي شيء.
يسجّل هذا الصندوق رسالة عند هبوطه. لديه مكوّن Rigidbody، لذا يسقط، وتصل الرسالة في الخطوة التي يلامس فيها الأرضية:
void OnCollisionEnter(Collision collision)
{
Debug.Log("Thud!");
}يسجّل الصندوق رسالة مرة واحدة، ثم لا يسجّلها مجددًا إلا بعد أن يغادر الأرضية ويهبط مرة ثانية. وتتلقى الأرضية الرسالة أيضًا: إذ يمكن لنص برمجي عليها أن يرصد هبوط الصندوق، رغم أن الأرضية لا تملك مكوّن Rigidbody. يجب أن يكون الاسم والمعامل مطابقين تمامًا. لا يُستدعى أبدًا أسلوب اسمه onCollisionEnter، ولا يظهر أي خطأ. أما الأسلوب الذي يستقبل Collider، فتسجّل Unity الرسالة Script error: OnCollisionEnter مع This message parameter has to be of type: Collision وتتجاهله. ما دام الجسمان متلامسين، تستدعي Unity OnCollisionStay في كل خطوة فيزياء، وعندما يفترقان، تستدعي OnCollisionExit مرة واحدة.
التحدي
سهلتعدّ لوحة الضغط ما يسقط عليها.
- أضف حقلًا
private int presses;إلىPressurePlate. - أضف
void OnCollisionEnter(Collision collision): أضف 1 إلىpressesوسجّل"Pressed " + presses.
اضغط «العب»: تسقط الصندوقة وتُظهر وحدة التحكم Pressed 1 مرة واحدة. ثم اضغط «تحقق».
جرّب بنفسك
using UnityEngine;
public class PressurePlate : MonoBehaviour
{
// احسب كل هبوط وسجّله: Pressed 1, Pressed 2, ...
}
جميع دروس الفيزياء وأسلوب اللعب
1الجسم الصلب (Rigidbody)
الجاذبية والكتلةالدفع باستخدام AddForceالقفز باستخدام دفعةFixedUpdate للفيزياءالسرعة المتجهةالأجسام الحركيةمراجعة: منصة الإطلاق4الكوروتينات
InvokeInvokeRepeating, CancelInvokeأول Coroutine لكالحلقات داخل الكوروتيناتإيقاف الكوروتيناتمراجعة: العد التنازلي10المشروع: الهروب من الحلبة
الحلبةالصيادونتدرّب بنفسك: Playground لـ Unity