Menu
CoddyTech

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.

challenge icon

Thử thách

Trung bình

Hãy làm cho cú xoay mượt mà theo hướng mà mỗi mũi tên chỉ.

  1. Thêm Quaternion goal; và đặt giá trị này thành transform.rotation trong Start().
  2. Khi Input.GetKeyDown nhận một phím mũi tên, hãy đặt giá trị cho goal, ví dụ: goal = Quaternion.LookRotation(Vector3.right);: lên +z, phải +x, xuống -z, trái -x.
  3. 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

Tự luyện tập: Playground Unity