Menu
CoddyTech

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.

challenge icon

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ó.

  1. Trong Start(), đặt rb.isKinematic = true;.
  2. Trong FixedUpdate(), đọc float h = Input.GetAxisRaw("Horizontal"); và gọi rb.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

Tự luyện tập: Playground Unity