Menu
CoddyTech

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 مرة واحدة.

challenge icon

التحدي

سهل

تعدّ لوحة الضغط ما يسقط عليها.

  1. أضف حقلًا private int presses; إلى PressurePlate.
  2. أضف void OnCollisionEnter(Collision collision): أضف 1 إلى presses وسجّل "Pressed " + presses.

اضغط «العب»: تسقط الصندوقة وتُظهر وحدة التحكم Pressed 1 مرة واحدة. ثم اضغط «تحقق».

جرّب بنفسك

using UnityEngine;

public class PressurePlate : MonoBehaviour
{
    // احسب كل هبوط وسجّله: Pressed 1, Pressed 2, ...
}

جميع دروس الفيزياء وأسلوب اللعب

تدرّب بنفسك: Playground لـ Unity