Đuổi theo người chơi
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 52 trên 71.
Kẻ địch đuổi theo người chơi cần có Rigidbody để tường có thể chặn nó, đồng thời nó có thể đẩy và bị đẩy. Bản thân việc đuổi theo là một vận tốc hướng về phía người chơi, được thiết lập một lần trong mỗi bước vật lý. Zombie này đi về phía bất cứ thứ gì nằm trong ô player:
[SerializeField] private Transform player;
[SerializeField] private float speed = 2.5f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
Vector3 toPlayer = player.position - rb.position;
toPlayer.y = 0f;
Vector3 dir = toPlayer.normalized;
rb.linearVelocity = new Vector3(dir.x * speed, rb.linearVelocity.y, dir.z * speed);
}player.position - rb.position hướng từ zombie đến người chơi. Giá trị y được đặt thành 0 để zombie đi trên mặt phẳng ngang khi người chơi đứng ở vị trí cao hơn hoặc thấp hơn, còn normalized khiến độ dài của nó bằng 1, nhờ đó zombie di chuyển với speed dù người chơi cách xa 2 hay 20 đơn vị. Vận tốc mới giữ nguyên vận tốc y cũ, vì vậy trọng lực vẫn kéo zombie xuống khi nó bước hụt khỏi bậc. Rigidbody của nó bật Freeze Rotation, nên nó không bị nghiêng đổ khi di chuyển.
Thiết lập vận tốc sẽ khiến kẻ địch đi bộ bắt đầu di chuyển và đổi hướng ngay lập tức. Thay vào đó, hãy dùng AddForce trong cùng FixedUpdate để đẩy một kẻ địch nặng, chẳng hạn như thùng phuy lăn: nó tăng tốc, giữ đà và lăn quá đà khi người chơi né sang bên.
Vector3 toPlayer = player.position - rb.position;
toPlayer.y = 0f;
rb.AddForce(toPlayer.normalized * push);Tránh di chuyển Transform của kẻ địch đang đuổi theo: cách đó có thể đặt nó xuyên vào tường cũng dễ như đặt ở bất kỳ vị trí nào khác, rồi sau đó bộ máy vật lý chỉ có thể đẩy nó ra ngoài.
Thử thách
Trung bìnhKhiến tảng đá lăn theo người chơi.
- Trong
FixedUpdate(), đặtVector3 toPlayer = player.position - rb.position;vàtoPlayer.y = 0f;để lực đẩy luôn hướng dọc theo mặt đất. - Gọi
rb.AddForce(toPlayer.normalized * force);để lực đẩy như nhau dù bạn ở gần hay xa. Để tảng đá tự do xoay, nhờ đó ma sát sẽ làm nó lăn.
Nhấn Chơi rồi chạy vòng quanh tảng đá. Sau đó nhấn Kiểm tra.
Tự làm thử
using UnityEngine;
public class Boulder : MonoBehaviour
{
[SerializeField] private Transform player;
[SerializeField] private float force = 6f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
// Đẩy tảng đá về phía người chơi, dọc theo mặt đất
}
}
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 xu3Vùng kích hoạt
Collider kích hoạtOnTriggerEnterVật phẩm thu thậpThùng giữ lại phần còn lạiVùng tiêu diệtVào và thoátÔn tập: chìa khóa và cánh cửa6Raycast
Physics.RaycastRaycastHitKiểm tra mặt đất bằng tiaLayer và LayerMaskTầm nhìnOverlapSphere và SphereCastÔn tập: Dây báo động laser9Kẻ địch
Đuổi theo người chơiĐuổi theo trong tầmTuần tra và truy đuổiMáu và sát thươngĐạn trúng mục tiêuĐánh bật lùiÔn tập: Chó giữ nhàTự luyện tập: Playground Unity