Menu
CoddyTech

Acciones de entrada

Parte de la sección Creación de juegos reales del Journey de Unity de Coddy. Lección 47 de 60.

Probar las teclas una por una vincula un script al teclado. Una acción nombra lo que hace el jugador, y el proyecto indica qué teclas, palancas y botones la activan. Un proyecto nuevo de Unity 6 incluye un conjunto de acciones (el recurso InputSystem_Actions, configurado como las acciones de todo el proyecto), cuyo mapa Player tiene Move (WASD, las flechas y la palanca izquierda de un mando), Look (el ratón o la palanca derecha), Attack (el botón izquierdo del ratón y Enter), Interact (E, mantenida), Crouch (C), Jump (Espacio y el botón inferior del mando), Previous y Next (1 y 2) y Sprint (Shift izquierdo). Están activadas desde el principio, y InputSystem.actions.FindAction("Jump") obtiene una por nombre. Esta grúa de garra con vista lateral se mueve en x e y y agarra al pulsar 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!");
    }
}

Las acciones se buscan una sola vez, en Start, y se guardan en campos InputAction. Move proporciona un Vector2: x es derecha e izquierda, y es arriba y abajo en las teclas, y está normalizado, así que W y D juntas dan (0.71, 0.71) en lugar de (1, 1). La grúa se ve desde un lado, así que usa esa y para la altura; un juego visto desde arriba la usaría para z. Las acciones de botón responden como las teclas: WasPressedThisFrame(), WasReleasedThisFrame() e IsPressed(). Dos errores provocan excepciones: un nombre mal escrito hace que FindAction devuelva null (una NullReferenceException en la primera lectura), y ReadValue<Vector3>() en Move provoca una InvalidOperationException en cuanto se mantiene pulsada una tecla, porque Move contiene un Vector2.

challenge icon

Desafío

Intermedio

Haz que el topógrafo camine y plante banderas con las acciones del proyecto.

  1. En Start(), asigna valores a moveAction, jumpAction y attackAction con InputSystem.actions.FindAction("Move"), "Jump" y "Attack".
  2. En Update(), haz que camine multiplicando moveAction.ReadValue<Vector2>() por speed, usando su eje y para z.
  3. Llama a Plant() cuando se cumpla jumpAction.WasPressedThisFrame() y a PullUp() al pulsar Attack.

Pulsa «Jugar», planta tres banderas y haz clic para retirar una. Después, pulsa «Comprobar».

Pruébalo tú mismo

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()
    {
        // busca las acciones Move, Jump y Attack
    }

    void Update()
    {
        // camina con Move, ejecuta Plant() al pulsar Jump y PullUp() al pulsar 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);
    }
}

Todas las lecciones de Creación de juegos reales

Practica por tu cuenta: Playground de Unity