Menu
CoddyTech

دفع الأشياء

جزء من قسم إنشاء ألعاب حقيقية في رحلة Unity على Coddy. الدرس 41 من 60.

لا يدفع CharacterController أي شيء أبدًا: وجّهه نحو صندوق يحتوي على Rigidbody، وسيتوقف كما لو أنه اصطدم بجدار. بدلًا من ذلك، تستدعي Unity الدالة OnControllerColliderHit(ControllerColliderHit hit) في النصوص البرمجية الخاصة بالمتحكم نفسه، لكل مُصادم تلامسه حركة Move، بما في ذلك الأرضية، ويحدد النص البرمجي ما يحدث. يشير hit.collider إلى ما تم لمسه، ويشير hit.moveDirection إلى اتجاه حركة Move التي لامسته، ويشير hit.normal إلى الاتجاه الذي يواجهه سطحه عند نقطة التلامس. هذا هو نص الدفع البرمجي الخاص بـ Unity:

public float pushPower = 2f;

void OnControllerColliderHit(ControllerColliderHit hit)
{
    Rigidbody body = hit.collider.attachedRigidbody;
    if (body == null || body.isKinematic) return;   // لا يوجد شيء لدفعه
    if (hit.moveDirection.y < -0.3f) return;        // إنه تحت أقدامنا

    Vector3 pushDir = new Vector3(hit.moveDirection.x, 0f, hit.moveDirection.z);
    body.linearVelocity = pushDir * pushPower;
}

لكل return سبب. لا تحتوي الأرضية والجدران على Rigidbody، لذا تكون قيمة body null بالنسبة إليها، كما أنها تُلمَس في كل حركة Move تقريبًا. يتحرك الجسم الحركي فقط عندما يحرّكه نصه البرمجي الخاص، لذا لا تؤثر فيه السرعة. حركة Move المتجهة بشدة إلى الأسفل قد لمست شيئًا تحت القدمين، ولا ينبغي دفع الصندوق الذي يقف عليه اللاعب.

يحتفظ اتجاه الدفع بـ x وz فقط، لذا ينزلق الصندوق على الأرض بدلًا من الضغط عليه. إن تعيين linearVelocity، بدلًا من إضافة قوة، يجعل الصندوق الخفيف والثقيل يتحركان بالسرعة نفسها؛ أما body.AddForce(pushDir * pushPower, ForceMode.Impulse) فسيدفع الصندوق الثقيل بدرجة أقل.

challenge icon

التحدي

متوسط

اجعل اللاعب يركل الكرات التي يصطدم بها أثناء سيره.

  1. في Kicker.cs، اكتب void OnControllerColliderHit(ControllerColliderHit hit) واحصل على Rigidbody body = hit.collider.attachedRigidbody;.
  2. استخدم return عندما تكون body فارغة أو حركية، أو عندما يكون hit.moveDirection.y < -0.3f (كرة تحت القدمين).
  3. اضبط body.linearVelocity على اتجاه الحركة مع قيمة y تساوي 0، مضروبًا في kickPower، مضافًا إليه Vector3.up * lift.

اضغط على «العب» وامشِ نحو الكرة الحمراء: ستطير إلى الأمام وإلى الأعلى. ثم اضغط على «تحقق».

جرّب بنفسك

using UnityEngine;

public class Kicker : MonoBehaviour
{
    public float kickPower = 6f;
    public float lift = 4f;

    // اركل الكرات التي يصطدم بها اللاعب أثناء سيره
}

جميع دروس إنشاء ألعاب حقيقية

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