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łą.
Wyzwanie
ŚredniKopnij 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
linearVelocityw kierunku ruchu, równolegle do podłoża, pomnożoną przezkickPower, a następnie dodajliftskierowane 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
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Tworzenie prawdziwych gier
1Tekst na ekranie
Canvas i tekstWyświetlanie wynikuFormatowanie liczbOdliczanie czasuPowtórka: prędkościomierz4Sceny i poziomy
Wczytaj scenęUruchom poziom ponownieNastępny poziomZachowaj między scenamiPodsumowanie: wybór poziomu10Projekt: platformówka 3D
TrasaRuchome platformy2Przyciski 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 skok