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.
Wyzwanie
ŚredniPozwól graczowi kopać piłki, na które wchodzi.
- W pliku
Kicker.csnapiszvoid OnControllerColliderHit(ControllerColliderHit hit)i pobierzRigidbody body = hit.collider.attachedRigidbody;. - Użyj
return, gdybodyma wartość null lub jest kinematyczne albo gdyhit.moveDirection.y < -0.3f(piłka znajduje się pod stopami). - Ustaw
body.linearVelocityna kierunek ruchu z wartością y równą 0, pomnożony przezkickPower, plusVector3.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
1Tekst na ekranie
Canvas i tekstWyświetlanie wynikuFormatowanie liczbOdliczanie czasuPowtórka: prędkościomierz2Przyciski i ekrany
Przyciski i onClickLambdyPodłączanie w InspectorzeWłączanie i wyłączanie paneliPaski zdrowiaPodsumowanie: sklep z ulepszeniami5Zapisywanie za pomocą PlayerPrefs
Zapisz liczbęWczytywanie z wartością domyślnąNajlepszy wynikZapisz ustawieniaPodsumowanie: monety w banku8Sterowanie postacią
CharacterController.MoveGrawitacja ręcznieSkakaniePopychanie obiektówPoruszanie się w kierunku patrzeniaPodsumowanie: podwójny skokPoćwicz samodzielnie: Edytor online Unity