Menu
CoddyTech

Azioni di input

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

Verificare i tasti uno per uno lega uno script alla tastiera. Un'azione indica invece cosa fa il giocatore, e il progetto elenca quali tasti, levette e pulsanti la attivano. Un nuovo progetto Unity 6 include un set di azioni (l'asset InputSystem_Actions, impostato come insieme di azioni a livello di progetto), la cui mappa Player contiene Move (WASD, le frecce e la levetta sinistra di un gamepad), Look (il mouse o la levetta destra), Attack (il pulsante sinistro del mouse ed Enter), Interact (E, tenuto premuto), Crouch (C), Jump (Space e il pulsante inferiore del gamepad), Previous e Next (1 e 2) e Sprint (Left Shift). Sono attivate fin dall'inizio e InputSystem.actions.FindAction("Jump") ne recupera una per nome. Questa gru artigliata con visuale laterale si muove lungo x e y e afferra con Jump:

using UnityEngine;
using UnityEngine.InputSystem;

public class ClawCrane : MonoBehaviour
{
    public float speed = 3f;

    private InputAction moveAction;
    private InputAction jumpAction;

    void Start()
    {
        moveAction = InputSystem.actions.FindAction("Move");
        jumpAction = InputSystem.actions.FindAction("Jump");
    }

    void Update()
    {
        Vector2 input = moveAction.ReadValue<Vector2>();
        transform.position += new Vector3(input.x, input.y, 0f) * speed * Time.deltaTime;

        if (jumpAction.WasPressedThisFrame())
            Debug.Log("Grab!");
    }
}

Le azioni vengono recuperate una sola volta, in Start, e conservate nei campi InputAction. Move restituisce un Vector2: x corrisponde a destra e sinistra, y a su e giù sui tasti, e il valore è normalizzato, quindi W e D premuti insieme danno (0.71, 0.71) anziché (1, 1). La gru è vista di lato, quindi usa y per l'altezza; un gioco visto dall'alto lo userebbe per z. Le azioni dei pulsanti funzionano come i tasti: WasPressedThisFrame(), WasReleasedThisFrame() e IsPressed(). Due errori causano eccezioni: un nome scritto male fa sì che FindAction restituisca null (una NullReferenceException alla prima lettura), mentre ReadValue<Vector3>() su Move genera una InvalidOperationException appena viene tenuto premuto un tasto, perché Move restituisce un Vector2.

challenge icon

Sfida

Medio

Fai camminare il rilevatore e pianta bandiere con le azioni del progetto.

  1. In Start(), imposta moveAction, jumpAction e attackAction con InputSystem.actions.FindAction("Move"), "Jump" e "Attack".
  2. In Update(), cammina moltiplicando moveAction.ReadValue<Vector2>() per speed, con la sua y lungo z.
  3. Chiama Plant() quando jumpAction.WasPressedThisFrame() e PullUp() quando premi Attack.

Premi «Gioca», pianta tre bandiere e fai clic per rimuoverne una. Poi premi «Verifica».

Provalo tu

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;

public class Surveyor : MonoBehaviour
{
    public float speed = 4f;
    public int flags = 3;
    public GameObject flagPrefab;

    private InputAction moveAction;
    private InputAction jumpAction;
    private InputAction attackAction;
    private List<GameObject> planted = new List<GameObject>();

    void Start()
    {
        // trova le azioni Move, Jump e Attack
    }

    void Update()
    {
        // cammina con Move, esegui Plant() quando premi Jump e PullUp() quando premi Attack
    }

    void Plant()
    {
        if (flags == 0) return;
        Vector3 spot = new Vector3(transform.position.x, 0.75f, transform.position.z);
        planted.Add(Instantiate(flagPrefab, spot, Quaternion.identity));
        flags--;
        Debug.Log("Flags left: " + flags);
    }

    void PullUp()
    {
        if (planted.Count == 0) return;
        GameObject last = planted[planted.Count - 1];
        planted.RemoveAt(planted.Count - 1);
        Destroy(last);
        flags++;
        Debug.Log("Flags left: " + flags);
    }
}

Tutte le lezioni di Creare veri giochi

Esercitati da solo: Playground Unity