Ciała kinematyczne
Część sekcji Fizyka i rozgrywka ścieżki Unity w Coddy. Lekcja 6 z 71.
Ruchome platformy, windy i drzwi muszą zderzać się jak obiekty stałe, ale nie mogą spadać ani być przesuwane przez to, co na nie spadnie. Tak działa ciało kinematyczne: ustaw rb.isKinematic = true, a grawitacja, siły i uderzenia przestaną nim poruszać. Jego collider nadal bierze udział w kolizjach, więc ciało dynamiczne (poruszane przez fizykę) uderza w nie jak w ścianę 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 o długości jednego kroku, 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 obiekt 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 tego kroku, dzięki czemu to, czego dotyka, jest prawidłowo przenoszone i popychane. 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
ŁatwyZawieś barkę nad lawą i przesuwaj ją za pomocą strzałek.
- W
Start()ustawrb.isKinematic = true;. - W
FixedUpdate()odczytajfloat h = Input.GetAxisRaw("Horizontal");i wywołajrb.MovePosition(rb.position + Vector3.right * h * speed * Time.fixedDeltaTime);.
Naciśnij „Graj” i przesuń barkę: będzie zawieszona w powietrzu, a dron się od niej odbije. Następnie naciśnij „Sprawdź”.
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 kinematyczną
}
void FixedUpdate()
{
// Przesuwaj ją wzdłuż osi x za pomocą strzałek
}
}
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 startowa4Korutyny
WywoływanieInvokeRepeating i CancelInvokeTwoja pierwsza korutynaPętle w korutynachZatrzymywanie korutynPodsumowanie: odliczanie10Projekt: Ucieczka z areny
ArenaŁowcy2Kolizje
OnCollisionEnterW co uderzyłem?Rozbijanie przy zderzeniuStanie na podłożuOdbicie i tarcieKształty colliderówPodsumowanie: Zniszczalny mur5Projekt: Wyścig po monety
Tocząca się piłkaZbieranie monet3Wyzwalacze
Kolizje wyzwalająceOnTriggerEnterPrzedmioty do zebraniaSkrzynie zatrzymują resztęStrefy śmierciWejście i wyjściePodsumowanie: klucz i drzwiPoćwicz samodzielnie: Edytor online Unity