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.
Thử thách
Trung bìnhCho ong quay mặt theo hướng bay và luôn giữ thẳng đứng.
- Trong
LateUpdate(), đặtVector3 direction = transform.position - lastPosition;vàdirection.y = 0;. - Chỉ khi
direction != Vector3.zero, hãy đặttransform.rotation = Quaternion.LookRotation(direction);, để ong vẫn giữ nguyên hướng khi nghỉ. - Cuối cùng, lưu
transform.positionvàolastPosition.
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
1Rigidbody
Trọng lực và khối lượngĐẩy bằng AddForceNhảy bằng xung lựcFixedUpdate cho vật lýVận tốcVật thể động họcÔn tập: Bệ phóng4Coroutine
InvokeInvokeRepeating, CancelInvokeCoroutine đầu tiên của bạnVòng lặp trong CoroutineDừng CoroutineÔn tập: đếm ngược10Dự án: Thoát khỏi đấu trường
Đấu trườngThợ săn2Va chạm
OnCollisionEnterMình đã va chạm với gì?Vỡ khi va chạmĐứng trên mặt đấtĐộ nảy và ma sátHình dạng colliderÔn tập: Tường có thể phá vỡ5Dự án: Cuộc đua thu thập xu
Quả bóng lănThu thập xuTự luyện tập: Playground Unity