Menu
CoddyTech

Theo sát 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 47 trên 71.

Một camera sao chép vị trí của người chơi rồi cộng thêm độ lệch trong LateUpdate() sẽ khiến mỗi cú giật của người chơi làm góc nhìn giật theo. Vector3.SmoothDamp(current, target, ref velocity, smoothTime) trả về một vị trí di chuyển về phía target giống như chuyển động của lò xo giảm chấn: nó tăng tốc, chậm lại khi đến gần mục tiêu và dừng đúng vị trí mà không vượt quá. Camera này theo sau người chơi, cách 3 đơn vị phía trên và 6 đơn vị phía sau, với một chút độ trễ:

public Transform player;
public Vector3 offset = new Vector3(0, 3, -6);
public float smoothTime = 0.3f;
Vector3 velocity;

void LateUpdate()
{
    Vector3 target = player.position + offset;
    transform.position = Vector3.SmoothDamp(transform.position, target, ref velocity, smoothTime);
}

ref truyền chính biến cho SmoothDamp thay vì một bản sao, để phương thức có thể thay đổi biến đó. SmoothDamp lưu tốc độ hiện tại của camera trên cả ba trục trong velocity và cần nhận lại giá trị này ở khung hình tiếp theo, vì vậy nó phải là một trường. Nếu khai báo bên trong LateUpdate(), biến sẽ bắt đầu từ 0 ở mỗi khung hình và camera sẽ bò rất chậm, chỉ đi được khoảng nửa phần trăm quãng đường mỗi khung hình. Với một số đơn lẻ, chẳng hạn như mức thu phóng của camera, Mathf.SmoothDamp hoạt động tương tự với một biến tốc độ kiểu float.

smoothTime xác định độ trễ của camera: với giá trị 0.3, camera di chuyển được khoảng 60% quãng đường khi vị trí đột ngột thay đổi sau 0.3 giây và gần như đến nơi sau 1 giây. Giá trị nhỏ hơn giúp camera bám sát hơn. SmoothDamp tự đọc Time.deltaTime, vì vậy bạn không cần nhân giá trị nào trong lời gọi với nó.

challenge icon

Thử thách

Trung bình

Khiến camera bám theo người chơi mượt mà ở độ cao cố định.

  1. Thêm một trường (field) Vector3 velocity;.
  2. Trong LateUpdate(), tạo Vector3 target = new Vector3(player.position.x, height, player.position.z - back); để cú nhảy không làm khung hình di chuyển.
  3. Đặt transform.position = Vector3.SmoothDamp(transform.position, target, ref velocity, smoothTime);.

Nhấn Chơi, chạy và nhảy: camera sẽ hơi bám theo, nhưng không bao giờ nhấp nhô. Sau đó nhấn Kiểm tra.

Tự làm thử

using UnityEngine;

public class TopDownCamera : MonoBehaviour
{
    public Transform player;
    public float height = 12f;
    public float back = 5f;
    public float smoothTime = 0.25f;

    void LateUpdate()
    {
        // Di chuyển mượt đến vị trí có cùng tọa độ x với player, lùi về sau back đơn vị theo trục z và giữ độ cao cố định.
    }
}

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

Tự luyện tập: Playground Unity