Menu
CoddyTech

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

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

عندما تنظر الكاميرا إلى اللاعب من زاوية، ينبغي أن تحرّك الأسهم اللاعب كما تُظهر الشاشة: إلى الأعلى يمشي مبتعدًا عن الكاميرا، وإلى اليمين يمشي نحو يمين الكاميرا. لا تحقّق محاور العالم ذلك إلا عندما تنظر الكاميرا على امتداد +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

التحدي

متوسط

اجعل الأسهم تحرّك اللاعب نسبةً إلى الكاميرا الدوّارة.

  1. في Update()، انسخ cam.forward وcam.right، واجعل y تساوي 0، ثم طبّع المتجهين.
  2. يساوي dir forward مضروبًا في المحور الخام "Vertical" زائدًا right مضروبًا في "Horizontal"، وطبّعه عندما يكون طوله أكبر من 1.
  3. عندما يكون dir != Vector3.zero، عيّن transform.rotation = Quaternion.LookRotation(dir);. أنشئ move من dir * speed.

اضغط «العب»: يتحرك اللاعب إلى الأمام مبتعدًا عن الكاميرا، أيًّا كان اتجاه نظرها. ثم اضغط «تحقق».

جرّب بنفسك

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);
    }
}

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

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