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

CharacterController.Move

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

CharacterController هو مكوّن Unity المخصص لشخصية تمشي: كبسولة لا تتحرك إلا عندما يستدعي النص البرمجي الخاص بك controller.Move(motion). تمثّل motion المسافة التي يجب قطعها في هذا الإطار، ولذلك فهي تساوي السرعة مضروبة في Time.deltaTime. تنزلق Move بالكبسولة على طول الجدران بدلًا من المرور عبرها، وتصعد المنحدرات حتى حد Slope Limit (45 درجة)، وتصعد إلى الحواف حتى قيمة Step Offset (0.3 وحدة). وهي ليست Rigidbody: لا قوى، ولا جاذبية، ولا ارتداد، ولا شيء يدفعها. إنها تتحرك تمامًا إلى حيث ترسلها Move، وهذا ما تحتاج إليه عناصر التحكم الدقيقة في الألعاب.

الجاذبية عليك إضافتها، وكذلك العثور على الأرض. تكون isGrounded صحيحة عندما تلامس آخر استدعاء لـ Move شيئًا أسفلها، لذلك فإن الحركة التي لا تتضمن جزءًا متجهًا إلى الأسفل لا تعثر على الأرض أبدًا. الحركة التي تقل عن Min Move Distance الخاص بوحدة التحكم (0.001) لا تفعل شيئًا على الإطلاق، ولذلك فإن وحدة تحكم تتحرك جانبًا فقط تُبلغ بأنها ليست على الأرض بمجرد أن تتوقف. تمشي شخصية التوصيل هذه باستخدام مفاتيح الأسهم وتضغط إلى الأسفل قليلًا في كل حركة:

public class Courier : MonoBehaviour
{
    public float speed = 6f;
    CharacterController controller;

    void Start()
    {
        controller = GetComponent<CharacterController>();
    }

    void Update()
    {
        Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
        move.y = -2f;   // اضغط دائمًا إلى الأسفل، حتى يتم العثور على الأرضية
        controller.Move(move * Time.deltaTime);
        if (!controller.isGrounded)
        {
            Debug.Log("Off the ground");
        }
    }
}

تظل الكبسولة على بُعد Skin Width (0.08) من الشيء الذي تلامسه، لذلك تستقر وحدة تحكم ارتفاعها 2 وحدة على أرضية عند y = 0 على ارتفاع y = 1.08، وليس 1. وتبدأ Move من الموضع الذي رأت فيه الفيزياء وحدة التحكم آخر مرة، لذا يمكن التراجع عن تعيين transform.position عليها عند استدعاء Move التالي: لنقلها آنيًا، عيّن controller.enabled = false، ثم حرّكها، وأعِد تفعيلها.

challenge icon

التحدي

متوسط

يقف المستكشف على منصة حجرية، خلفها جدار وعلى يسارها حافة. اكتب Explorer.cs على كائن Player، الذي يحتوي على CharacterController. يضبط Inspector القيمتين speed (4) وfallSpeed (3)، كما أن Start() يعثر بالفعل على وحدة التحكم وRenderer الخاص بالمستكشف.

  • تحرّكه مفاتيح الأسهم (أو WASD)، المقروءة باستخدام المحاور الخام، عبر controller.Move بسرعة speed وحدة في الثانية: إلى اليسار واليمين على محور x، وإلى الأعلى والأسفل على محور z. يجب أن يوقفه الجدار.
  • تتحرك كل حركة أيضًا إلى الأسفل بسرعة fallSpeed وحدة في الثانية، ليبقى المستكشف على المنصة ويسقط من حافتها.
  • عندما تكون وحدة التحكم على الأرض، يكون لون المستكشف Color.green؛ وعندما لا تكون كذلك، يكون Color.red.

اضغط على Play، وامشِ نحو الجدار ثم اسقط من الحافة، وبعدها اضغط على Check.

جرّب بنفسك

using UnityEngine;

public class Explorer : MonoBehaviour
{
    public float speed = 4f;
    public float fallSpeed = 3f;

    CharacterController controller;
    Renderer rend;

    void Start()
    {
        controller = GetComponent<CharacterController>();
        rend = GetComponent<Renderer>();
    }

    void Update()
    {
        // حرّك المستكشف باستخدام controller.Move، ثم غيّر لونه بناءً على isGrounded
    }
}
quiz iconاختبر نفسك

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

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