Vật thể động học
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 6 trên 71.
Sàn di động, thang máy và cửa cần va chạm như các đối tượng rắn, nhưng chúng không được rơi hoặc bị thứ gì đáp xuống đẩy đi. Đó là một thân thể động học: đặt rb.isKinematic = true, khi đó trọng lực, lực và va chạm sẽ không còn làm nó chuyển động. Bộ va chạm của nó vẫn có tác dụng, nên một thân thể động (được vật lý làm cho chuyển động) sẽ va vào nó như va vào tường và đứng trên nó như đứng trên sàn. Bạn tự di chuyển thân thể động học bằng rb.MovePosition.
Thang máy này đi lên với tốc độ lift m/s cho đến khi chạm đến top. MovePosition nhận vị trí cần đến sau bước này, nên code cộng thêm quãng đường di chuyển trong một bước, bằng Time.fixedDeltaTime:
void Start()
{
rb = GetComponent<Rigidbody>();
rb.isKinematic = true;
}
void FixedUpdate()
{
if (rb.position.y < top)
{
rb.MovePosition(rb.position + Vector3.up * lift * Time.fixedDeltaTime);
}
}Sao không đặt transform.position? Cách đó dịch chuyển tức thời đối tượng, khiến vật lý không biết nó đã di chuyển: một thùng hàng trên sàn trượt sẽ bị bỏ lại phía sau thay vì di chuyển theo. MovePosition báo cho vật lý biết thân thể đã di chuyển đến vị trí mới trong bước này, nhờ đó những thứ nó chạm vào sẽ được mang theo và đẩy đi đúng cách. AddForce không có tác dụng với thân thể động học, và các thân thể động học không bao giờ va chạm với bộ va chạm tĩnh hoặc với nhau: chỉ các thân thể động mới va vào chúng.
Thử thách
DễTreo chiếc sà lan phía trên dung nham và dùng các phím mũi tên để trượt nó.
- Trong
Start(), đặtrb.isKinematic = true;. - Trong
FixedUpdate(), đọcfloat h = Input.GetAxisRaw("Horizontal");và gọirb.MovePosition(rb.position + Vector3.right * h * speed * Time.fixedDeltaTime);.
Nhấn Chơi rồi trượt sà lan: nó lơ lửng trên không, còn drone bật ra. Sau đó nhấn Kiểm tra.
Tự làm thử
using UnityEngine;
public class Barge : MonoBehaviour
{
public float speed = 2f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
// Đặt sà lan ở chế độ kinematic
}
void FixedUpdate()
{
// Dùng các phím mũi tên để di chuyển sà lan dọc theo trục x
}
}
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