Jedź na platformie
Część sekcji Tworzenie prawdziwych gier ścieżki Unity w Coddy. Lekcja 51 z 60.
CharacterController nie jest przenoszony przez obiekt, na którym stoi: na ruchomej platformie pozostaje w miejscu, a platforma przesuwa się pod nim. Zmiana jego transform.position nie pomaga, ponieważ następne Move zaczyna od miejsca, w którym fizyka widziała go ostatnio, i cofa tę zmianę.
Dlatego gracz dodaje ruch platformy do własnego ruchu. OnControllerColliderHit(ControllerColliderHit hit) uruchamia się dla każdego elementu collider, którego dotyka Move; trafienie od spodu ma wartość hit.normal.y bliską 1. Prom, który przenosi skrzynię w ten sam sposób:
private Ferry ferry;
void OnControllerColliderHit(ControllerColliderHit hit)
{
if (hit.normal.y > 0.7f && hit.gameObject.TryGetComponent(out Ferry f))
{
ferry = f;
}
}Wyzwanie
ŚredniSpraw, by postać jechała na ruchomej platformie.
- W
Playerdodajprivate MovingPlatform platform;orazOnControllerColliderHit: gdyhit.normal.y > 0.5fi obiekt ma komponentMovingPlatform, przypisz go doplatform. - W
Update()umieść(move + velocity) * Time.deltaTimewVector3 motion. Jeśliplatform != null, dodajplatform.deltai ustawplatform = null. - Wywołaj
controller.Move(motion).
Naciśnij „Graj” i wskocz na platformę: poniesie cię. Następnie naciśnij „Sprawdź”.
Spróbuj swoich sił
using UnityEngine;
using UnityEngine.InputSystem;
public class Player : MonoBehaviour
{
[SerializeField] private float speed = 5f;
[SerializeField] private float jumpHeight = 1.5f;
[SerializeField] private float gravity = -9.81f;
private CharacterController controller;
private InputAction moveAction;
private InputAction jumpAction;
private Vector3 velocity;
void Start()
{
controller = GetComponent<CharacterController>();
moveAction = InputSystem.actions.FindAction("Move");
jumpAction = InputSystem.actions.FindAction("Jump");
}
void Update()
{
if (controller.isGrounded && velocity.y < 0f)
{
velocity.y = -2f;
}
Vector2 input = moveAction.ReadValue<Vector2>();
Vector3 move = new Vector3(input.x, 0f, input.y) * speed;
if (jumpAction.WasPressedThisFrame() && controller.isGrounded)
{
velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity);
}
velocity.y += gravity * Time.deltaTime;
controller.Move((move + velocity) * Time.deltaTime);
}
}
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 bankuPoćwicz samodzielnie: Edytor online Unity