Menu
CoddyTech

المسار

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

يبني هذا الفصل لعبة منصات ثلاثية الأبعاد. تركض وتقفز عبر منصات عائمة، وتركب منصة تنزلق، وتلمس نقاط حفظ كي لا تعيدك السقطة إلى البداية، وتجمع الجواهر التي يُعرض عددها على الشاشة، وتعبر خط النهاية إلى المستوى التالي وتحاول تحطيم أفضل وقت حققته. تتكوّن اللعبة من خمسة نصوص برمجية موجودة في المشروع منذ البداية: Player وMovingPlatform وCheckpoint وGem وFinishLine. النصوص الأربعة الأخيرة فارغة حاليًا، ويُكمل كل درس واحدًا منها. اللاعب هو CharacterController تتحكم به إجراءات Input System، والكاميرا هي عنصر تابع له، لذا تتبعه دون الحاجة إلى نص برمجي.

يتحرك CharacterController بطريقتين. تحركه Move(motion) مسافةً من دون إضافة أي شيء، لذا فإن الجاذبية والقفزات وTime.deltaTime من مسؤولية النص البرمجي، كما في فصل Character Controller. تأخذ SimpleMove(speed) سرعةً بوحدات في الثانية، وتضربها في زمن الإطار بنفسها وتضيف الجاذبية؛ وتتجاهل قيمة y التي تمررها إليها، لذا تسقط الشخصية التي تتحرك بها عن الحواف، لكنها لا تستطيع القفز أبدًا. هذا الكلب الراعي في لعبة رعي تُرى من الأعلى لا يحتاج إلى القفز، لذا تشكّل SimpleMove وإجراء Move نصه البرمجي كاملًا:

using UnityEngine;
using UnityEngine.InputSystem;

public class Sheepdog : MonoBehaviour
{
    [SerializeField] private float speed = 6f;
    private CharacterController controller;
    private InputAction moveAction;

    void Start()
    {
        controller = GetComponent<CharacterController>();
        moveAction = InputSystem.actions.FindAction("Move");
    }

    void Update()
    {
        Vector2 input = moveAction.ReadValue<Vector2>();
        controller.SimpleMove(new Vector3(input.x, 0f, input.y) * speed);
    }
}

على لاعب لعبة المنصات أن يقفز، لذا يحتفظ بسرعته الرأسية الخاصة ويتحرك باستخدام Move، ويقرأ إجراءي Move وJump بدلًا من الصنف Input. توصي Unity باستدعاء Move أو SimpleMove مرة واحدة في كل إطار: تُضمّن حركة المشي والسقوط في الاستدعاء نفسه، وعندها تصف isGrounded الحركة بأكملها.

challenge icon

التحدي

متوسط

اجعل اللاعب يمشي ويقفز ويسقط.

  1. في Start()، اعثر على Move وJump باستخدام InputSystem.actions.FindAction.
  2. في Update()، اجعل اللاعب يمشي بسرعة speed: حرّك x في Move على محور x، وy على محور z.
  3. أضف gravity * Time.deltaTime إلى velocity.y، واجعلها -2f عندما يكون اللاعب على الأرض ويسقط. عند القفز وهو على الأرض، اضبطها على Mathf.Sqrt(jumpHeight * -2f * gravity).
  4. استدعِ controller.Move((move + velocity) * Time.deltaTime) مرة واحدة.

اضغط على «العب»: اقفز إلى المنصة الأولى. ثم اضغط على «تحقق».

جرّب بنفسك

using UnityEngine;
using UnityEngine.InputSystem;

public class Player : MonoBehaviour
{
    [SerializeField] private float speed = 5f;
    [SerializeField] private float jumpHeight = 1.5f;
    [SerializeField] private float gravity = -9.81f;

    private CharacterController controller;
    private Vector3 velocity;

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

    void Update()
    {
        // تحرّك باستخدام إجراء Move، واقفز باستخدام إجراء Jump، واسقط بفعل الجاذبية
    }
}

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

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