Quay mượt mà
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 45 trên 71.
Gán trực tiếp một hướng xoay mới cho transform.rotation sẽ khiến đối tượng xoay trong một khung hình. Quaternion.RotateTowards(current, goal, maxDegrees) trả về current đã xoay về phía goal tối đa maxDegrees, và không bao giờ xoay quá hướng đích. Khi dùng turnSpeed * Time.deltaTime làm bước xoay, đối tượng xoay với tốc độ ổn định và dừng chính xác ở hướng đích, tương tự cách MoveTowards hoạt động với vị trí. Hoa hướng dương này hướng theo mặt trời với tốc độ 30 độ mỗi giây:
public Transform sun;
public float turnSpeed = 30f;
void Update()
{
Quaternion goal = Quaternion.LookRotation(sun.position - transform.position);
transform.rotation = Quaternion.RotateTowards(transform.rotation, goal, turnSpeed * Time.deltaTime);
}Nếu mặt trời cách 90 độ, hoa hướng dương sẽ mất 3 giây để hướng theo, mỗi giây xoay 30 độ. Nó xoay theo hướng ngắn nhất, và hướng đích được tính lại ở mỗi khung hình, nên hoa sẽ hướng theo mặt trời đang di chuyển.
Quaternion.Slerp(a, b, t) là hướng xoay nằm cách a một phần t trên đường đến b, giống như Vector3.Lerp áp dụng với các điểm. Khi viết Slerp(transform.rotation, goal, 5f * Time.deltaTime) trong Update(), mỗi khung hình đối tượng xoay một phần của góc còn lại: ban đầu nhanh, rồi chậm dần khi gần đến hướng đích, không bao giờ xoay với tốc độ cố định và cũng không bao giờ đến hẳn đích. Kiểu xoay nhẹ nhàng này phù hợp với camera hoặc chuyển động quay đầu. Khi tốc độ xoay là một quy tắc trong trò chơi, chẳng hạn như khẩu pháo xoay 60 độ mỗi giây, hãy dùng RotateTowards.
Thử thách
Trung bìnhHãy làm cho cú xoay mượt mà theo hướng mà mỗi mũi tên chỉ.
- Thêm
Quaternion goal;và đặt giá trị này thànhtransform.rotationtrongStart(). - Khi
Input.GetKeyDownnhận một phím mũi tên, hãy đặt giá trị chogoal, ví dụ:goal = Quaternion.LookRotation(Vector3.right);: lên +z, phải +x, xuống -z, trái -x. - Mỗi khung hình, đặt
transform.rotation = Quaternion.RotateTowards(transform.rotation, goal, turnSpeed * Time.deltaTime);.
Nhấn Chơi rồi nhấn các phím mũi tên. Sau đó nhấn Kiểm tra.
Tự làm thử
using UnityEngine;
public class Owl : MonoBehaviour
{
public float turnSpeed = 180f;
void Update()
{
// Lên, phải, xuống, trái: xoay để hướng về +z, +x, -z, -x với tốc độ turnSpeed độ mỗi giây.
}
}
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