Menu
CoddyTech

Nhìn trước

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 49 trên 71.

Camera đặt giữa người chơi đang di chuyển sẽ cho thấy cả khu vực phía sau lẫn phía trước họ. Thay vào đó, góc nhìn ngang có thể đi trước: đặt camera cách người chơi vài đơn vị về phía trước, theo hướng họ đang di chuyển.

Hướng đi trước đổi khi người chơi quay lại, nhưng nếu hướng đi trước đổi ngay lập tức thì toàn bộ khung hình sẽ giật mạnh. Vì vậy, hãy lưu hướng đi trước trong một trường và dịch chuyển nó dần đến giá trị mới bằng Mathf.MoveTowards, từng chút một theo mỗi khung hình. Camera thuyền này đi trước 2 đơn vị và dịch chuyển với tốc độ 3 đơn vị mỗi giây:

float lead;
float heading = 1f;   // 1 đi thuyền sang phải, -1 đi thuyền sang trái

void LateUpdate()
{
    lead = Mathf.MoveTowards(lead, heading * 2f, 3f * Time.deltaTime);
    transform.position = new Vector3(boat.position.x + lead, transform.position.y, transform.position.z);
}

Hướng đi là hướng thuyền di chuyển lần gần nhất: so sánh tọa độ x hiện tại với tọa độ x ở khung hình trước, và giữ nguyên hướng đi trong khung hình thuyền không di chuyển, để thuyền đang đứng yên vẫn giữ khoảng cách đi trước.

challenge icon

Thử thách

Trung bình

Điều chỉnh camera bên để hiển thị nhiều hơn về phía trước của nhân vật chạy.

  1. Trong LateUpdate(), so sánh tọa độ x của nhân vật chạy với lastX: đi sang phải thì đặt direction thành 1, đi sang trái thì đặt thành -1, đứng yên thì giữ nguyên giá trị.
  2. Điều chỉnh dần shift = Mathf.MoveTowards(shift, direction * ahead, shiftSpeed * Time.deltaTime);.
  3. Đặt tọa độ x của camera thành player.position.x + shift, đồng thời giữ nguyên y và z.

Nhấn Chơi và chạy theo cả hai hướng. Sau đó nhấn Kiểm tra.

Tự làm thử

using UnityEngine;

public class LookAheadCamera : MonoBehaviour
{
    public Transform player;
    public float ahead = 3f;
    public float shiftSpeed = 4f;

    void LateUpdate()
    {
        // Đưa camera đi trước player một khoảng ahead theo hướng di chuyển gần nhất, rồi dịch chuyển mượt với tốc độ shiftSpeed.
        transform.position = new Vector3(player.position.x, transform.position.y, transform.position.z);
    }
}

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

Tự luyện tập: Playground Unity