Menu
CoddyTech

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.

challenge icon

Wyzwanie

Łatwy

Zawieś barkę nad lawą i przesuwaj ją za pomocą strzałek.

  1. W Start() ustaw rb.isKinematic = true;.
  2. W FixedUpdate() odczytaj float h = Input.GetAxisRaw("Horizontal"); i wywołaj rb.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

Poćwicz samodzielnie: Edytor online Unity