Camera bám theo không bị giật
Làm sao cho camera bám nhân vật mà không bị giật?
Di chuyển camera trong LateUpdate, đừng dùng Update: LateUpdate chạy sau khi mọi thứ khác đã di chuyển xong, nên camera đọc được vị trí đã chốt. Nếu nhân vật dùng Rigidbody thì đặt thêm tuỳ chọn Interpolate của Rigidbody thành Interpolate — vật lý chạy theo nhịp khác với nhịp khung hình.
Camera bám theo chỉ gồm bốn dòng code và một quyết định về chỗ đặt chúng. Đặt trong Update thì camera đọc một vị trí mà nhân vật chưa di chuyển xong, và khung hình nào cũng trễ một nhịp — mắt bạn đọc ra thành rung.
Unity chạy hết Update rồi mới tới LateUpdate. Di chuyển camera ở nửa đầu là nó đọc một vị trí mà nhân vật tới khung hình sau mới đạt được.
Luôn dùng LateUpdate
Unity chạy hết mọi Update trong cảnh, rồi mới chạy mọi LateUpdate. Thứ gì phải phản ứng theo vị trí cuối cùng của khung hình này thì thuộc về LateUpdate, và camera bám theo là ví dụ mẫu mực.
using UnityEngine;
public class FollowCamera : MonoBehaviour
{
public Transform target;
public Vector3 offset = new Vector3(0f, 6f, -8f);
[Range(1f, 30f)]
public float smooth = 10f;
void LateUpdate()
{
if (target == null) return;
Vector3 wanted = target.position + offset;
// Làm mượt không phụ thuộc khung hình. Lerp thường với t cố định sẽ đi
// xa hơn mỗi giây khi FPS cao hơn.
transform.position = Vector3.Lerp(
transform.position, wanted, 1f - Mathf.Exp(-smooth * Time.deltaTime));
transform.LookAt(target.position + Vector3.up * 1.5f);
}
}Nếu nhân vật dùng Rigidbody
Chỉ LateUpdate thôi thì chưa đủ ở đây. Vật lý chạy 50 nhịp mỗi giây trong khi màn hình vẽ 60, 90 hay 120 lần, nên ở phần lớn khung hình nhân vật chưa nhúc nhích kể từ nhịp vật lý trước mà camera thì đã đi. Chính độ lệch đó là cái giật.
Đặt Interpolate của Rigidbody nhân vật thành Interpolate. Unity sẽ vẽ nó nội suy giữa hai nhịp vật lý thay vì nhảy cóc, và camera có thứ mượt để bám theo.
Chỉ bật cho nhân vật, đừng bật cho mọi Rigidbody trong cảnh — nội suy tốn bộ nhớ cho từng vật, mà chẳng ai nhìn mấy cái thùng.
Đừng bao giờ di chuyển Rigidbody bằng transform.position khi có camera bám theo. Làm vậy là bỏ qua nội suy hoàn toàn và cái giật quay lại ngay.
Vẫn chưa mượt?
Kiểm tra xem còn script nào khác ghi vào vị trí camera không. Hai script tranh nhau một transform trông y hệt giật.
Xem chỉ số khung hình trong bảng Stats của Game view trước đã. Giật ở mức khoá 30 FPS thì không phải lỗi camera.
Nếu camera đang là con của nhân vật thì xoá script đi — làm con thì nó đã bám theo sẵn rồi. Để cả hai là chúng giằng co nhau.
bài học làm ra thứ này
Camera bám theo
Bài này là một công thức đứng riêng. Trong khoá học, cùng thứ đó được dựng như một phần của dự án xuyên suốt năm tab — Camera & Điều khiển, bài 01.