Menu
CoddyTech

Ciała kinematyczne

Część sekcji Fizyka i rozgrywka ścieżki Unity w Coddy. Lekcja 6 z 63.

Ruchome platformy, windy i drzwi muszą zderzać się jak bryły, ale nie mogą spadać ani być przesuwane przez cokolwiek, co na nie spadnie. To ciało kinematyczne: ustaw rb.isKinematic = true, a grawitacja, siły i uderzenia nie będą już nim poruszać. Jego collider nadal ma znaczenie, więc ciało dynamiczne (którym porusza fizyka) odbija się od niego jak od ściany i stoi na nim jak na podłodze. Ciałem kinematycznym poruszasz samodzielnie za pomocą rb.MovePosition.

Ta winda wznosi się z prędkością lift m/s, aż dotrze do top. MovePosition przyjmuje pozycję, w której obiekt ma się znaleźć po tym kroku, więc kod dodaje przesunięcie odpowiadające jednemu krokowi, używając 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);
    }
}

Dlaczego nie ustawić transform.position? To teleportuje obiekt, a fizyka nie dowiaduje się, że się poruszył: skrzynia na przesuwanej platformie zostałaby w tyle zamiast poruszać się razem z nią. MovePosition informuje fizykę, że ciało przemieściło się w nowe miejsce podczas kroku, dzięki czemu obiekty, których dotyka, są odpowiednio przenoszone i odpychane. AddForce nie działa na ciele kinematycznym, a ciała kinematyczne nigdy nie zderzają się ze statycznymi colliderami ani ze sobą nawzajem: zderzają się z nimi tylko ciała dynamiczne.

challenge icon

Wyzwanie

Łatwy

Barka wisi nad lawą, a strzałki powinny przesuwać ją w lewo i w prawo wzdłuż osi x z prędkością speed m/s (2 w Inspectorze). Obecnie jej Rigidbody jest zwykłe, więc barka spada do lawy.

  • Gdy gra się rozpocznie, ustaw barkę jako kinematic, aby wisiała w powietrzu i nic, co w nią uderzy, nie mogło jej odepchnąć.
  • Przesuwaj ją za pomocą MovePosition w FixedUpdate(), używając surowej osi Horizontal.

Naciśnij Play i przesuń barkę, a następnie naciśnij Check.

Spróbuj swoich sił

using UnityEngine;

public class Barge : MonoBehaviour
{
    public float speed = 2f;
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
        // Ustaw barkę jako obiekt kinematyczny
    }

    void FixedUpdate()
    {
        // Przesuwaj ją wzdłuż osi x za pomocą strzałek
    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Fizyka i rozgrywka