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ó.
Thử thách
Trung bìnhKhiến camera bám theo người chơi mượt mà ở độ cao cố định.
- Thêm một trường (field)
Vector3 velocity;. - Trong
LateUpdate(), tạoVector3 target = new Vector3(player.position.x, height, player.position.z - back);để cú nhảy không làm khung hình di chuyển. - Đặ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
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