Đấu trường
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 59 trên 71.
Chương này hướng dẫn bạn xây dựng Arena Escape. Bạn né tránh những kẻ săn đuổi trong một đấu trường có tường bao quanh khi từng đợt kẻ địch tràn vào. Ba lần trúng đòn sẽ kết thúc lượt chơi, và lối thoát sẽ mở ra khi đợt cuối cùng kết thúc. Trò chơi có năm script ngay từ đầu trong dự án: Player, Hunter, Spawner, Health và Exit. Bốn script cuối hiện vẫn trống, mỗi bài học sẽ hoàn thiện một script.
Người chơi di chuyển nhờ lực thay vì tự đặt vận tốc, nhờ vậy lực đẩy lùi của kẻ săn đuổi sẽ cộng thêm vào chuyển động thay vì bị xóa đi. Chỉ dùng lực đẩy thì tốc độ sẽ tăng mãi, vì vậy linearDamping làm giảm một phần tốc độ ở mỗi bước: lực đẩy ổn định sẽ khiến tốc độ dần đạt mức tối đa, xấp xỉ gia tốc chia cho lực cản. Chiếc xe trượt lướt này đẩy về phía trước khi bạn giữ phím Space:
[SerializeField] private float accel = 12f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
rb.linearDamping = 2f;
}
void FixedUpdate()
{
if (Input.GetKey(KeyCode.Space))
{
rb.AddForce(transform.forward * accel, ForceMode.Acceleration);
}
}Với gia tốc là 12 và lực cản là 2, xe trượt đạt tốc độ tối đa gần 6 đơn vị mỗi giây. Khi bạn thả phím Space, lực cản khiến xe dừng lại thay vì tiếp tục trượt mãi. ForceMode.Acceleration không phụ thuộc vào khối lượng, nên xe trượt nặng tăng tốc y hệt xe nhẹ. Collider của xe trượt dùng PhysicsMaterial không có ma sát: nếu tính thêm ma sát từ sàn bên cạnh lực cản, tốc độ tối đa sẽ thấp hơn.
Thử thách
Trung bìnhBắt đầu Arena Escape: người chơi trượt nhờ lực.
- Trong
Start(), sau dòngGetComponent, đặtrb.linearDamping = accel / topSpeed;để tốc độ dần ổn định gầntopSpeed. - Trong
FixedUpdate(), tạonew Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")). - Truyền giá trị
normalizednhân vớiaccelvàorb.AddForcecùng vớiForceMode.Acceleration.
Nhấn Chơi và trượt quanh đấu trường. Sau đó, nhấn Kiểm tra.
Tự làm thử
using UnityEngine;
public class Player : MonoBehaviour
{
[SerializeField] private float accel = 18f;
[SerializeField] private float topSpeed = 6f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
// thiết lập lực cản, rồi dùng các phím mũi tên để đẩy nhân vậ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 xuTự luyện tập: Playground Unity