Menu
CoddyTech

Popychanie obiektów

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

CharacterController nigdy niczego nie popycha: poprowadź go na skrzynię z komponentem Rigidbody, a 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 tym podłogi, 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 Unity do popychania:

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 uzasadnienie. Podłogi i ściany nie mają komponentu Rigidbody, więc wartość body jest dla nich null, a Move dotyka ich niemal za każdym razem. Ciało kinematyczne porusza się tylko wtedy, gdy porusza nim jego własny skrypt, więc nadanie mu prędkości nic nie daje. Wywołanie Move skierowane stromo w dół dotknęło czegoś pod stopami, a skrzyni, na której stoi gracz, nie należy popychać.

Kierunek popychania uwzględnia tylko x i z, więc skrzynia ślizga się po podłożu, zamiast być w nie wciskana. 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ą słabiej.

challenge icon

Wyzwanie

Średni

Pozwól graczowi kopać piłki, na które wchodzi.

  1. W pliku Kicker.cs napisz void OnControllerColliderHit(ControllerColliderHit hit) i pobierz Rigidbody body = hit.collider.attachedRigidbody;.
  2. Użyj return, gdy body ma wartość null lub jest kinematyczne albo gdy hit.moveDirection.y < -0.3f (piłka znajduje się pod stopami).
  3. Ustaw body.linearVelocity na kierunek ruchu z wartością y równą 0, pomnożony przez kickPower, plus Vector3.up * lift.

Naciśnij „Graj” i wejdź na czerwoną piłkę: poleci do przodu i w górę. Następnie naciśnij „Sprawdź”.

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
}

Wszystkie lekcje w sekcji Tworzenie prawdziwych gier

Poćwicz samodzielnie: Edytor online Unity