Menu
CoddyTech

Ações de entrada

Parte da seção Criando jogos de verdade do Journey de Unity da Coddy. Lição 46 de 56.

Testar as teclas uma por uma vincula um script ao teclado. Uma ação nomeia o que o jogador faz, e o projeto lista quais teclas, analógicos e botões a acionam. Um novo projeto Unity 6 vem com um conjunto delas (o asset InputSystem_Actions, definido como as ações de todo o projeto), cujo mapa Player tem Move (WASD, as setas e o analógico esquerdo de um controle), Look (o mouse ou o analógico direito), Attack (o botão esquerdo do mouse e Enter), Interact (E, pressionada), Crouch (C), Jump (Espaço e o botão inferior do controle), Previous e Next (1 e 2) e Sprint (Shift esquerdo). Elas ficam ativadas desde o início, e InputSystem.actions.FindAction("Jump") obtém uma pelo nome. Este guindaste de garra com visão lateral se move nos eixos x e y e agarra ao pressionar 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!");
    }
}

As ações são encontradas uma vez, em Start, e mantidas em campos InputAction. Move fornece um Vector2: x corresponde à direita e à esquerda, y corresponde a cima e baixo nas teclas, e o vetor é normalizado, então W e D juntas fornecem (0.71, 0.71), em vez de (1, 1). Como a visão do guindaste é lateral, ele usa esse y para a altura; um jogo visto de cima usaria esse valor para z. As ações de botão respondem como as teclas: WasPressedThisFrame(), WasReleasedThisFrame() e IsPressed(). Dois erros causam problemas: um nome escrito incorretamente faz FindAction retornar null (uma NullReferenceException na primeira leitura), e ReadValue<Vector3>() em Move lança uma InvalidOperationException assim que uma tecla é pressionada, porque Move contém um Vector2.

challenge icon

Desafio

Médio

O agrimensor mapeia um campo nevado, visto de cima, e carrega flags (3) para plantar pelo caminho. O script tem speed (4), flags, flagPrefab e uma lista planted. Use as ações do projeto:

  • Move movimenta o agrimensor pelo campo nevado a speed unidades por segundo: para a direita e para a esquerda ao longo do eixo x, para cima e para baixo ao longo do eixo z.
  • Cada pressionamento de Jump planta uma bandeira: uma cópia de flagPrefab nas coordenadas x e z do agrimensor, em y 0.75, adicionada a planted. Isso consome uma das flags e registra quantas restam, como Flags left: 2. Se não restarem bandeiras, Jump não planta nada.
  • Cada pressionamento de Attack (um clique com o botão esquerdo) desenterra a última bandeira plantada: ela é destruída e removida da lista, flags aumenta em um, e a mesma linha é registrada.

Pressione Play, plante três bandeiras e desenterre uma; em seguida, pressione Check.

Experimente você mesmo

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()
    {
        // encontre as ações Move, Jump e Attack
    }

    void Update()
    {
        // ande com Move, plante uma bandeira com Jump e retire uma com Attack
    }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Criando jogos de verdade