Menu
CoddyTech

Hướng theo hướng di chuyển

Thuộc phần Vật lý và lối chơi trong hành trình Unity của Coddy. Bài học 44 trên 71.

transform.LookAt cần một điểm để nhìn về phía đó. Thường thì bạn có một hướng thay vì một điểm: vận tốc, hướng gió, hướng một vật đã di chuyển. Quaternion.LookRotation(direction) trả về phép quay sao cho hướng về phía trước (mũi tên z màu xanh lam) chỉ dọc theo hướng đó, đồng thời giữ hướng lên của đối tượng hướng về phía trên của thế giới. Mũi tên được bắn lên không trung ban đầu sẽ chĩa lên trên rồi nghiêng xuống khi rơi, vì vận tốc của nó thay đổi như vậy:

Rigidbody rb;

void Start()
{
    rb = GetComponent<Rigidbody>();
}

void Update()
{
    if (rb.linearVelocity != Vector3.zero)
    {
        transform.rotation = Quaternion.LookRotation(rb.linearVelocity);
    }
}

Chỉ hướng mới quan trọng, không phải độ dài: (1, 0, 2) và (3, 0, 6) cho cùng một phép quay. Vectơ không có hướng, nên LookRotation(Vector3.zero) ghi nhật ký Look rotation viewing vector is zero và trả về Quaternion.identity, khiến đối tượng xoay đột ngột để hướng về +z. Đó là lý do mũi tên kiểm tra trước: khi dừng lại, nó giữ nguyên hướng đang có. LookAt(target.position) tạo ra phép quay giống với LookRotation(target.position - transform.position).

Thành phần lên xuống của hướng sẽ khiến hướng về phía trước nghiêng lên hoặc xuống theo. Với vật thể cần luôn đứng thẳng, chẳng hạn như một người đi bộ lên dốc, hãy đặt y của hướng thành 0 trước, để đối tượng chỉ xoay quanh trục y. Đối số thứ hai, LookRotation(direction, Vector3.up), chỉ định hướng nào là hướng lên; nếu không có đối số này, mặc định là Vector3.up.

challenge icon

Thử thách

Trung bình

Cho ong quay mặt theo hướng bay và luôn giữ thẳng đứng.

  1. Trong LateUpdate(), đặt Vector3 direction = transform.position - lastPosition; và direction.y = 0;.
  2. Chỉ khi direction != Vector3.zero, hãy đặt transform.rotation = Quaternion.LookRotation(direction);, để ong vẫn giữ nguyên hướng khi nghỉ.
  3. Cuối cùng, lưu transform.position vào lastPosition.

Nhấn Chơi: ong quay về phía từng bông hoa mà nó bay đến. Sau đó nhấn Kiểm tra.

Tự làm thử

using UnityEngine;

public class FaceMotion : MonoBehaviour
{
    Vector3 lastPosition;

    void Start()
    {
        lastPosition = transform.position;
    }

    void LateUpdate()
    {
        // Quay mặt theo hướng con ong đã di chuyển kể từ khung hình trước.
    }
}

Tất cả bài học trong Vật lý và lối chơi

Tự luyện tập: Playground Unity