Menu
CoddyTech

Sali sulla piattaforma

Fa parte della sezione Creare veri giochi del percorso Unity di Coddy. Lezione 51 di 60.

Un CharacterController non viene trasportato da ciò su cui si trova: su una piattaforma mobile resta fermo e la piattaforma scivola via sotto di lui. Spostare il suo transform.position non serve, perché il successivo Move parte dal punto in cui la fisica lo ha visto l'ultima volta e annulla la modifica.

Quindi il giocatore aggiunge il movimento della piattaforma al proprio. OnControllerColliderHit(ControllerColliderHit hit) viene eseguito per ogni collider toccato da un Move; un contatto dal basso ha hit.normal.y vicino a 1. Un traghetto che trasporta una cassa allo stesso modo:

private Ferry ferry;

void OnControllerColliderHit(ControllerColliderHit hit)
{
    if (hit.normal.y > 0.7f && hit.gameObject.TryGetComponent(out Ferry f))
    {
        ferry = f;
    }
}
challenge icon

Sfida

Medio

Fai in modo che il giocatore venga trasportato dalla piattaforma mobile.

  1. In Player, aggiungi private MovingPlatform platform; e OnControllerColliderHit: quando hit.normal.y > 0.5f e l'oggetto ha un componente MovingPlatform, memorizzalo in platform.
  2. In Update(), inserisci (move + velocity) * Time.deltaTime in Vector3 motion. Se platform != null, aggiungi platform.delta e imposta platform = null.
  3. Chiama controller.Move(motion).

Premi «Gioca» e salta sulla piattaforma: ti trasporterà. Poi premi «Verifica».

Provalo tu

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);
    }
}

Tutte le lezioni di Creare veri giochi

Esercitati da solo: Playground Unity