Menu
CoddyTech

Il percorso

Fa parte della sezione Creare veri giochi del percorso Unity di Coddy. Lezione 48 di 56.

Questo capitolo realizza un platform 3D. Corri e salti tra piattaforme fluttuanti, sali su una che scivola, tocchi i checkpoint così che una caduta non ti rimandi all'inizio, raccogli gemme conteggiate sullo schermo, attraversi il traguardo per passare al livello successivo e cerchi di battere il tuo record. Il gioco è composto da cinque script, presenti nel progetto fin dall'inizio: Player, MovingPlatform, Checkpoint, Gem e FinishLine. Gli ultimi quattro sono vuoti per ora e ogni lezione ne completa uno. Il personaggio è un CharacterController controllato tramite le azioni dell'Input System, e la telecamera è un suo elemento figlio, quindi lo segue senza bisogno di uno script.

Un CharacterController si muove in due modi. Move(motion) lo sposta di una distanza e non aggiunge nulla, quindi gravità, salti e Time.deltaTime sono compito dello script, come nel capitolo Character Controller. SimpleMove(speed) usa una velocità in unità al secondo, la moltiplica per il tempo del frame e aggiunge la gravità; ignora il valore y che gli passi, quindi un personaggio mosso con questo metodo cade dai bordi, ma non può mai saltare. Questo cane da pastore in un gioco di conduzione visto dall'alto non ha bisogno di saltare, quindi SimpleMove e l'azione Move costituiscono tutto il suo script:

using UnityEngine;
using UnityEngine.InputSystem;

public class Sheepdog : MonoBehaviour
{
    [SerializeField] private float speed = 6f;
    private CharacterController controller;
    private InputAction moveAction;

    void Start()
    {
        controller = GetComponent<CharacterController>();
        moveAction = InputSystem.actions.FindAction("Move");
    }

    void Update()
    {
        Vector2 input = moveAction.ReadValue<Vector2>();
        controller.SimpleMove(new Vector3(input.x, 0f, input.y) * speed);
    }
}

Il personaggio del platform deve poter saltare, quindi gestisce la propria velocità verticale e si muove con Move, leggendo le azioni Move e Jump invece della classe Input. Unity consiglia una sola chiamata a Move o SimpleMove per frame: la camminata e la caduta confluiscono nella stessa chiamata, e isGrounded descrive quindi l'intero movimento.

challenge icon

Sfida

Medio

Inizia il platform con il giocatore. Lo script Player ha speed (5), jumpHeight (1.5) e gravity (-9.81), il controller e una velocity per la caduta. Trova una sola volta le azioni Move e Jump, in Start, e in Update:

  • Move fa camminare il giocatore a speed unità al secondo: a destra e a sinistra lungo x, avanti e indietro lungo z.
  • La gravità aggiunge gravity * Time.deltaTime a velocity.y a ogni frame. Quando il controller è a terra e velocity.y è minore di 0, imposta prima velocity.y a -2, così il giocatore resta premuto a terra.
  • Ogni pressione di Jump, quando il giocatore è a terra, imposta velocity.y su Mathf.Sqrt(jumpHeight * -2f * gravity): un salto alto jumpHeight unità. Tenendo premuto Jump si salta una sola volta, e non si può saltare a mezz'aria.
  • Chiama controller.Move una sola volta, combinando la camminata e velocity, moltiplicate per Time.deltaTime.

Premi Play e salta fino alle prime piattaforme, poi premi Check.

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 Vector3 velocity;

    void Start()
    {
        controller = GetComponent<CharacterController>();
    }

    void Update()
    {
        // cammina con l'azione Move, salta con l'azione Jump, cadi per effetto della gravità
    }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Creare veri giochi