Menu
CoddyTech

Di chuyển theo hướng nhìn

Thuộc phần Xây dựng trò chơi thực tế trong hành trình Unity của Coddy. Bài học 42 trên 60.

Khi camera nhìn người chơi từ một góc, các phím mũi tên nên di chuyển người chơi theo hướng trên màn hình: đi lên là ra xa camera, đi sang phải là về phía bên phải của camera. Các trục của thế giới chỉ hoạt động như vậy khi camera nhìn dọc theo +z. Vì thế, hãy tạo hướng di chuyển từ các hướng của chính camera, cam.forward và cam.right.

Trước tiên, cần xử lý các hướng đó. Camera nhìn xuống người chơi sẽ có hướng forward chĩa xuống mặt đất, vì vậy hãy đặt y bằng 0 để chỉ giữ lại thành phần song song với mặt đất. Hướng còn lại sẽ ngắn hơn 1, khoảng 0.87 khi camera nghiêng xuống 30 độ, khiến người chơi di chuyển chậm hơn, nên hãy chuẩn hóa hướng đó. Nhân vật này đi theo camera chính, đang nhìn xuống một góc của màn chơi:

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();   // Di chuyển chéo không nhanh hơn
controller.Move(move * speed * Time.deltaTime);

Camera.main là camera được gắn thẻ MainCamera. Hai hướng này được đọc ở mỗi khung hình, vì vậy các phím điều khiển vẫn hoạt động đúng khi camera xoay. Nhấn lên và sang phải cùng lúc sẽ cộng hai vectơ đơn vị vuông góc với nhau, tạo thành vectơ dài khoảng 1.41, vì vậy hướng di chuyển sẽ được chuẩn hóa khi độ dài lớn hơn 1.

challenge icon

Thử thách

Trung bình

Dùng các phím mũi tên để di chuyển nhân vật theo hướng tương ứng với camera đang xoay.

  1. Trong Update(), sao chép cam.forward và cam.right, đặt y bằng 0 rồi chuẩn hóa.
  2. dir bằng forward nhân với trục "Vertical" thô, cộng với right nhân với "Horizontal", rồi chuẩn hóa nếu độ dài lớn hơn 1.
  3. Khi dir != Vector3.zero, đặt transform.rotation = Quaternion.LookRotation(dir);. Tạo move từ dir * speed.

Nhấn Chơi: nhấn lên sẽ đưa nhân vật đi xa khỏi camera, bất kể camera đang hướng về đâu. Sau đó nhấn Kiểm tra.

Tự làm thử

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;

        // Hiện di chuyển theo các trục của thế giới: đổi thành di chuyển theo hướng của cam và quay mặt về hướng di chuyển
        Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
        move.y = verticalSpeed;
        controller.Move(move * Time.deltaTime);
    }
}

Tất cả bài học trong Xây dựng trò chơi thực tế

Tự luyện tập: Playground Unity