Menu
CoddyTech
flag Ar iconالعربيةdown icon

دفع الأشياء

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

لا تدفع 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

التحدي

متوسط

اركل الكرات في أرجاء الساحة. يتحرك اللاعب باستخدام CharacterController (Walker.cs، جاهز). اكتب Kicker.cs وضعه أيضًا على اللاعب. يضبط Inspector القيمتين kickPower (6) وlift (4).

  • عندما يصطدم اللاعب بجسم يمكن دفعه، اضبط linearVelocity على اتجاه المشي، أفقيًا بمحاذاة الأرض، مضروبًا في kickPower، مع إضافة lift إلى الأعلى مباشرةً، لكي تطير الكرة إلى الأمام والأعلى.
  • لا يحتوي كل من الأرض والعمود على Rigidbody: تخطّهما دون إصدار خطأ.
  • لا تُركل الكرة الموجودة تحت قدمي اللاعب.

اضغط على Play واركل الكرة الحمراء، ثم اضغط على Check.

جرّب بنفسك

using UnityEngine;

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

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

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

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