Menu
CoddyTech

Đấ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.

challenge icon

Thử thách

Trung bình

Bắt đầu Arena Escape: người chơi trượt nhờ lực.

  1. Trong Start(), sau dòng GetComponent, đặt rb.linearDamping = accel / topSpeed; để tốc độ dần ổn định gần topSpeed.
  2. Trong FixedUpdate(), tạo new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")).
  3. Truyền giá trị normalized nhân với accel vào rb.AddForce cùng với ForceMode.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

Tự luyện tập: Playground Unity