Menu
CoddyTech

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;
    }
}
challenge icon

Aufgabe

Mittel

Sorge dafür, dass der Spieler auf der beweglichen Plattform mitfährt.

  1. Füge in Player private MovingPlatform platform; und OnControllerColliderHit hinzu: Wenn hit.normal.y > 0.5f gilt und das Objekt eine MovingPlatform enthält, speichere sie in platform.
  2. Schreibe in Update() (move + velocity) * Time.deltaTime in Vector3 motion. Wenn platform != null gilt, addiere platform.delta und setze platform = null.
  3. 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

Übe selbstständig: Unity-Playground