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.
Thử thách
Trung bìnhDù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.
- Trong
Update(), sao chépcam.forwardvàcam.right, đặtybằng 0 rồi chuẩn hóa. dirbằngforwardnhân với trục"Vertical"thô, cộng vớirightnhân với"Horizontal", rồi chuẩn hóa nếu độ dài lớn hơn 1.- Khi
dir != Vector3.zero, đặttransform.rotation = Quaternion.LookRotation(dir);. Tạomovetừ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ế
1Văn bản trên màn hình
Canvas và văn bảnHiển thị điểm sốĐịnh dạng sốĐồng hồ đếm ngượcÔn tập: Đồng hồ tốc độ7Điều khiển thời gian
Tạm dừng bằng timeScaleChuyển động chậmThời gian không bị co giãnÔn tập: Bullet Time2Nút bấm và màn hình
Nút bấm và onClickLambdaKết nối trong InspectorBật và tắt bảngThanh máuÔn tập: Cửa hàng nâng cấp5Lưu dữ liệu với PlayerPrefs
Lưu một sốTải với giá trị mặc địnhĐiểm cao nhấtLưu cài đặtÔn tập: Tiền xu trong ngân hàng8Bộ điều khiển nhân vật
CharacterController.MoveTự xử lý trọng lựcNhảyĐẩy vật thểDi chuyển theo hướng nhìnÔn tập: nhảy képTự luyện tập: Playground Unity