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.
Wyzwanie
ŁatwyBarka 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ą
MovePositionwFixedUpdate(), 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
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Fizyka i rozgrywka
1Ciało sztywne
Grawitacja i masaPopychanie za pomocą AddForceSkok z impulsemFixedUpdate dla fizykiPrędkośćCiała kinematycznePowtórka: platforma startowa2Kolizje
OnCollisionEnterW co uderzyłem?Rozbijanie przy zderzeniuStanie na podłożuOdbicie i tarcieKształty colliderówPodsumowanie: Zniszczalny mur