Menu
CoddyTech

Acciones de entrada

Parte de la sección Creación de juegos reales del Journey de Unity de Coddy. Lección 46 de 56.

Probar las teclas una por una vincula un script al teclado. Una acción nombra lo que hace el jugador, y el proyecto enumera qué teclas, palancas y botones la activan. Un proyecto nuevo de Unity 6 incluye un conjunto de ellas (el recurso InputSystem_Actions, establecido 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 (Space y el botón sur del mando), Previous y Next (1 y 2) y Sprint (Left Shift). Están activadas desde el principio, y InputSystem.actions.FindAction("Jump") obtiene una por su nombre. Esta grúa de garra vista de lado 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 de tipo InputAction. Move devuelve 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 de 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 lanza una InvalidOperationException en cuanto se mantiene pulsada una tecla, porque Move contiene un Vector2.

challenge icon

Desafío

Intermedio

El topógrafo cartografía un campo nevado visto desde arriba y lleva flags (3) para plantarlas por el camino. El script tiene speed (4), flags, flagPrefab y una lista planted. Usa las acciones del proyecto:

  • Move hace que el topógrafo camine por la nieve a speed unidades por segundo: a la derecha y a la izquierda a lo largo del eje x, y hacia arriba y hacia abajo a lo largo del eje z.
  • Cada vez que se pulsa Jump, se planta una bandera: una copia de flagPrefab en las coordenadas x y z del topógrafo, a una altura y de 0.75, que se añade a planted. Se consume una de las flags y se registra cuántas quedan, por ejemplo, Flags left: 2. Si no quedan banderas, Jump no planta ninguna.
  • Cada vez que se pulsa Attack (un clic izquierdo), se retira la última bandera plantada: se destruye y se quita de la lista, flags aumenta en uno y se registra la misma línea.

Pulsa Play, planta tres banderas y retira una; después, pulsa Check.

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 List<GameObject> planted = new List<GameObject>();

    void Start()
    {
        // busca las acciones Move, Jump y Attack
    }

    void Update()
    {
        // camina con Move, planta una bandera con Jump y arranca una con Attack
    }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Creación de juegos reales