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

التحرّك في اتجاه النظر

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

عندما تنظر الكاميرا إلى اللاعب من زاوية، ينبغي أن تحرّك الأسهم اللاعب كما تظهر الحركة على الشاشة: إلى الأعلى تعني السير بعيدًا عن الكاميرا، وإلى اليمين تعني السير إلى يمين الكاميرا. لا تنطبق محاور العالم بهذه الطريقة إلا عندما تنظر الكاميرا على طول +z. لذا كوّن الحركة من اتجاهات الكاميرا نفسها، cam.forward وcam.right.

يجب تعديلهما أولًا. فالكاميرا التي تنظر إلى اللاعب من الأعلى يكون اتجاه forward لديها مائلًا نحو الأرض، لذا اجعل قيمة y تساوي 0 للاحتفاظ بالجزء الموازي للأرض فقط. سيكون المتبقي أقصر من 1، نحو 0.87 لكاميرا مائلة إلى الأسفل بزاوية 30 درجة، ما يجعل اللاعب يسير ببطء أكبر، لذا طبّع الاتجاه. يتبع هذا المتحرك الكاميرا الرئيسية، التي تنظر إلى أحد أركان المستوى:

Transform cam = Camera.main.transform;

Vector3 forward = cam.forward;
forward.y = 0f;
forward.Normalize();
Vector3 right = cam.right;
right.y = 0f;
right.Normalize();

Vector3 move = forward * Input.GetAxisRaw("Vertical") + right * Input.GetAxisRaw("Horizontal");
if (move.magnitude > 1f) move.Normalize();   // الحركة القطرية ليست أسرع
controller.Move(move * speed * Time.deltaTime);

Camera.main هي الكاميرا التي تحمل الوسم MainCamera. تُقرأ الاتجاهات مرتين كل إطار، لذا تظل عناصر التحكم صحيحة عند دوران الكاميرا. تؤدي إضافة متجهي الوحدة المتعامدين عند الضغط على الأعلى واليمين معًا إلى متجه طوله نحو 1.41، لذا تُطبّع الحركة عندما يتجاوز طولها 1.

challenge icon

التحدي

متوسط

تدور الكاميرا ببطء حول اللاعب (CameraRig.cs، جاهز)، لذلك تستمر محاور العالم في الدوران على الشاشة. اجعل الأسهم تحرّك اللاعب بالنسبة إلى الكاميرا في Mover.cs، حيث كُتبت الجاذبية بالفعل. يضبط Inspector قيمة speed (4) وcam، وهو Transform الخاص بالكاميرا.

  • السهم للأعلى يجعل اللاعب يمشي مبتعدًا عن الكاميرا على الأرض، والسهم للأسفل باتجاهها، والسهمان لليمين واليسار إلى يمين الكاميرا ويسارها: بسرعة speed وحدة في الثانية في كل اتجاه، بما في ذلك الاتجاهات القطرية، رغم أن الكاميرا تنظر إلى اللاعب من الأعلى.
  • أثناء المشي، يستدير اللاعب ليواجه الاتجاه الذي يمشي نحوه. وعندما يتوقف، يظل مواجهًا لذلك الاتجاه.

اضغط على Play، وتجول بينما تدور الكاميرا، ثم اضغط على Check.

جرّب بنفسك

using UnityEngine;

public class Mover : MonoBehaviour
{
    public float speed = 4f;
    public float gravity = -15f;
    public Transform cam;

    CharacterController controller;
    float verticalSpeed;

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

    void Update()
    {
        if (controller.isGrounded && verticalSpeed < 0f)
        {
            verticalSpeed = -2f;
        }
        verticalSpeed += gravity * Time.deltaTime;

        // يتحرك على طول محاور العالم: اجعله يتحرك بالنسبة إلى cam ويواجه اتجاه حركته
        Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
        move.y = verticalSpeed;
        controller.Move(move * Time.deltaTime);
    }
}
quiz iconاختبر نفسك

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

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