Menu
CoddyTech

Popychanie obiektów

Część sekcji Tworzenie prawdziwych gier ścieżki Unity w Coddy. Lekcja 40 z 56.

CharacterController nigdy niczego nie popycha: gdy wejdziesz nim na skrzynię z Rigidbody, zatrzyma się tak, jakby napotkał ścianę. Zamiast tego Unity wywołuje OnControllerColliderHit(ControllerColliderHit hit) w skryptach przypisanych do kontrolera dla każdego collidera, którego dotknie wywołanie Move, włącznie z podłożem, a skrypt decyduje, co się stanie. hit.collider to obiekt, którego dotknięto, hit.moveDirection to kierunek wywołania Move, które go dotknęło, a hit.normal to kierunek, w którym zwrócona jest jego powierzchnia w miejscu kontaktu. Oto skrypt popychania używany przez Unity:

public float pushPower = 2f;

void OnControllerColliderHit(ControllerColliderHit hit)
{
    Rigidbody body = hit.collider.attachedRigidbody;
    if (body == null || body.isKinematic) return;   // nie ma czego pchać
    if (hit.moveDirection.y < -0.3f) return;        // jest pod naszymi stopami

    Vector3 pushDir = new Vector3(hit.moveDirection.x, 0f, hit.moveDirection.z);
    body.linearVelocity = pushDir * pushPower;
}

Każde return ma swoje uzasadnienie. Podłoże i ściany nie mają Rigidbody, więc body ma dla nich wartość null, a dotykamy ich niemal przy każdym wywołaniu Move. Ciało kinematyczne porusza się tylko wtedy, gdy porusza je jego własny skrypt, więc prędkość niczego w nim nie zmieni. Wywołanie Move skierowane stromo w dół dotknęło czegoś pod stopami, a skrzyni stojącej pod graczem nie należy popychać.

Kierunek popychania uwzględnia tylko osie x i z, więc skrzynia przesuwa się po podłożu zamiast być wciskana w nie. Ustawienie linearVelocity zamiast dodania siły sprawia, że lekka i ciężka skrzynia poruszają się w tym samym tempie; body.AddForce(pushDir * pushPower, ForceMode.Impulse) pchnęłoby cięższą z mniejszą siłą.

challenge icon

Wyzwanie

Średni

Kopnij piłki po podwórku. Gracz porusza się za pomocą CharacterController (Walker.cs, gotowy). Napisz Kicker.cs, również na obiekcie Player. W Inspectorze ustaw kickPower (6) i lift (4).

  • Gdy gracz wejdzie w ciało, które można popchnąć, ustaw jego linearVelocity w kierunku ruchu, równolegle do podłoża, pomnożoną przez kickPower, a następnie dodaj lift skierowane pionowo w górę, aby piłka poleciała do przodu i w górę.
  • Podłoże i słupek nie mają komponentu Rigidbody: pomiń je bez błędu.
  • Piłka znajdująca się pod stopami gracza nie zostaje kopnięta.

Naciśnij Play i kopnij czerwoną piłkę, a następnie naciśnij Check.

Spróbuj swoich sił

using UnityEngine;

public class Kicker : MonoBehaviour
{
    public float kickPower = 6f;
    public float lift = 4f;

    // Kop piłki, na które wpada gracz
}
quiz iconSprawdź się

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

Wszystkie lekcje w sekcji Tworzenie prawdziwych gier