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

المسار

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

يبني هذا الفصل لعبة منصات ثلاثية الأبعاد. تركض وتقفز عبر منصات عائمة، وتركب منصة تنزلق، وتلمس نقاط حفظ كي لا تعيدك السقطة إلى البداية، وتجمع الجواهر التي يُعرض عددها على الشاشة، وتعبر خط النهاية إلى المستوى التالي وتحاول تحطيم أفضل وقت لك. تتكون اللعبة من خمسة نصوص برمجية موجودة في المشروع منذ البداية: 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

التحدي

متوسط

ابدأ لعبة المنصات باللاعب. يحتوي البرنامج النصي Player على speed (5)، وjumpHeight (1.5)، وgravity (-9.81)، وعلى controller وvelocity للسقوط. اعثر على الإجرائي Move وJump مرة واحدة في Start، وفي Update:

  • يحرّك Move اللاعب بسرعة speed وحدة في الثانية: إلى اليمين واليسار على المحور x، وإلى الأمام والخلف على المحور z.
  • تضيف الجاذبية gravity * Time.deltaTime إلى velocity.y في كل إطار. عندما يكون المتحكم على الأرض وتكون velocity.y أقل من 0، عيّن velocity.y إلى -2 أولًا، حتى يبقى اللاعب مضغوطًا على الأرض.
  • كل ضغطة على Jump، أثناء وجود اللاعب على الأرض، تعيّن velocity.y إلى Mathf.Sqrt(jumpHeight * -2f * gravity): قفزة بارتفاع jumpHeight وحدة. الضغط باستمرار على Jump يؤدي إلى قفزة واحدة، ولا يمكن القفز في الهواء.
  • استدعِ controller.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، واسقط بفعل الجاذبية
    }
}
quiz iconاختبر نفسك

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

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