Menu
CoddyTech

Đẩy bằng AddForce

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

Khi một đối tượng có Rigidbody, vật lý sẽ di chuyển nó, vì vậy bạn không thay đổi vị trí của nó nữa mà thay vào đó đẩy nó. rb.AddForce(force) đẩy vật thể bằng một lực, một Vector3 được đo bằng newton. Lực không đặt tốc độ: lực làm vật thể tăng tốc trong suốt thời gian bạn tiếp tục tác dụng lực, mỗi giây tăng một lượng bằng lực chia cho khối lượng. Khi bạn ngừng đẩy, vật thể vẫn giữ tốc độ hiện tại.

Chiếc tàu đệm khí này (2 kg) có động cơ đẩy: khi bạn giữ phím mũi tên lên, một lực thrust đẩy nó về phía trước, theo hướng +z. Với lực đẩy bằng 12, nó tăng tốc độ thêm 12 / 2 = 6 m/s mỗi giây:

public float thrust = 12f;
private Rigidbody rb;

void Start()
{
    rb = GetComponent<Rigidbody>();
}

void FixedUpdate()
{
    if (Input.GetKey(KeyCode.UpArrow))
    {
        rb.AddForce(Vector3.forward * thrust);
    }
}

Hãy đặt các lực trong FixedUpdate(), hàm mà Unity gọi trước mỗi bước vật lý, 50 lần mỗi giây (bài học 4 giải thích lý do). Không có Time.deltaTime trong dòng lệnh này: AddForce đã phân bổ lực cho cả bước, còn nhân với Time.deltaTime sẽ khiến lực đẩy yếu đi 50 lần. Khi ở trên mặt đất, ma sát đẩy ngược lại, vì vậy một lực nhỏ có thể không di chuyển được một chiếc hộp nặng.

challenge icon

Thử thách

Dễ

Dùng lực để đẩy đĩa trượt quanh sân băng không có ma sát.

  1. Trong FixedUpdate(), đọc float h = Input.GetAxis("Horizontal"); và float v = Input.GetAxis("Vertical");.
  2. Gọi rb.AddForce(new Vector3(h, 0, v) * push);, không dùng Time.deltaTime.

Nhấn Chơi, đẩy rồi thả ra: đĩa trượt vẫn tiếp tục lướt. Sau đó nhấn Kiểm tra.

Tự làm thử

using UnityEngine;

public class PuckPusher : MonoBehaviour
{
    public float push = 4f;
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        // Đẩy đĩa: Horizontal theo trục x, Vertical theo trục z
    }
}

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

Tự luyện tập: Playground Unity