Auf der Plattform fahren
Teil des Abschnitts Echte Spiele entwickeln der Unity-Journey von Coddy. Lektion 51 von 60.
Ein CharacterController wird nicht von dem mitgenommen, worauf er steht: Auf einer beweglichen Plattform bleibt er an Ort und Stelle, während die Plattform darunter weggleitet. Seine transform.position zu verschieben, hilft nicht, weil der nächste Move an der Stelle beginnt, an der die Physik ihn zuletzt erfasst hat, und die Änderung rückgängig macht.
Also addiert der Spieler die Bewegung der Plattform zu seiner eigenen. OnControllerColliderHit(ControllerColliderHit hit) wird für jeden Collider ausgeführt, den ein Move berührt; bei einem Treffer von unten liegt hit.normal.y nahe bei 1. Eine Fähre, die eine Kiste auf dieselbe Weise mitnimmt:
private Ferry ferry;
void OnControllerColliderHit(ControllerColliderHit hit)
{
if (hit.normal.y > 0.7f && hit.gameObject.TryGetComponent(out Ferry f))
{
ferry = f;
}
}Aufgabe
MittelSorge dafür, dass der Spieler auf der beweglichen Plattform mitfährt.
- Füge in
Playerprivate MovingPlatform platform;undOnControllerColliderHithinzu: Wennhit.normal.y > 0.5fgilt und das Objekt eineMovingPlatformenthält, speichere sie inplatform. - Schreibe in
Update()(move + velocity) * Time.deltaTimeinVector3 motion. Wennplatform != nullgilt, addiereplatform.deltaund setzeplatform = null. - Rufe
controller.Move(motion)auf.
Drücke auf „Spielen“ und springe auf die Plattform: Sie trägt dich mit. Drücke dann auf „Prüfen“.
Probier es selbst
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);
}
}
Alle Lektionen in Echte Spiele entwickeln
1Text auf dem Bildschirm
Canvas und TextPunktestand anzeigenZahlen formatierenEin Countdown-TimerRückblick: Tachometer4Szenen und Level
Eine Szene ladenDas Level neu startenNächstes LevelZwischen Szenen beibehaltenRückblick: Levelauswahl10Projekt: 3D-Plattformer
Der ParcoursBewegliche Plattformen2Buttons und Bildschirme
Buttons und onClickLambdasVerknüpfungen im InspectorPanels ein- und ausblendenGesundheitsbalkenRückblick: Upgrade-Shop5Speichern mit PlayerPrefs
Eine Zahl speichernMit einem Standardwert ladenHöchstpunktzahlEinstellungen speichernRückblick: Münzen auf der BankÜbe selbstständig: Unity-Playground