Menu
CoddyTech

الارتداد

جزء من قسم الفيزياء وأسلوب اللعب في رحلة Unity على Coddy. الدرس 57 من 71.

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

[SerializeField] private float power = 8f;

void OnCollisionEnter(Collision collision)
{
    Vector3 away = collision.transform.position - transform.position;
    away.y = 0f;
    collision.rigidbody.AddForce(away.normalized * power, ForceMode.Impulse);
}

يشير collision.transform.position - transform.position من المصدّ إلى الجسم الذي اصطدم به. تُضبط قيمة y فيه على 0 لكي تبقى الركلة أفقية، ويجعل normalized حجمه ثابتًا مهما تباعد مركزا الجسمين. إن ForceMode.Impulse ركلة تحدث مرة واحدة: فهي تغيّر السرعة بمقدار power مقسومًا على الكتلة، دفعة واحدة؛ لذا تنطلق كرة كتلتها 2 بنصف سرعة كرة كتلتها 1. أما ForceMode.Force الافتراضي، فهو معدّ للتطبيق في كل خطوة، ويمنح تأثير خطوة واحدة، أي أقل بـ 50 مرة.

لا تدوم الركلة إلا ما دامت السرعة لا تُستبدل بقيمة أخرى. اللاعب الذي يضبط rb.linearVelocity من الأسهم في كل خطوة ضمن FixedUpdate يفقد تأثيرها بعد خطوة واحدة، لذا يجب على نص برمجي كهذا أن يترك السرعة دون تغيير للحظة بعد الاصطدام، أو أن يحرّك اللاعب باستخدام القوى.

challenge icon

التحدي

متوسط

اجعل اللاعب يُطلق موجة صادمة باستخدام مفتاح المسافة.

  1. عند Input.GetKeyDown(KeyCode.Space)، كرّر الحلقة foreach (Collider hit in Physics.OverlapSphere(transform.position, radius))، مع تخطي مُصادم اللاعب نفسه.
  2. لكل hit.TryGetComponent(out Rigidbody body)، احسب away = hit.transform.position - transform.position مع away.y = 0f.
  3. استدعِ body.AddForce(away.normalized * power + Vector3.up * lift, ForceMode.Impulse);.

اضغط على «العب» واضغط على مفتاح المسافة بين الصناديق. ثم اضغط على «تحقق».

جرّب بنفسك

using UnityEngine;

public class Shockwave : MonoBehaviour
{
    [SerializeField] private float radius = 4f;
    [SerializeField] private float power = 6f;
    [SerializeField] private float lift = 2f;

    void Update()
    {
        // عند الضغط على Space: ادفع كل Rigidbody داخل نطاق radius بعيدًا عن اللاعب
    }
}

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

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