Đẩ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.
Thử thách
DễDùng lực để đẩy đĩa trượt quanh sân băng không có ma sát.
- Trong
FixedUpdate(), đọcfloat h = Input.GetAxis("Horizontal");vàfloat v = Input.GetAxis("Vertical");. - Gọi
rb.AddForce(new Vector3(h, 0, v) * push);, không dùngTime.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
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