Menu
CoddyTech

Eingabeaktionen

Teil des Abschnitts Echte Spiele entwickeln der Unity-Journey von Coddy. Lektion 47 von 60.

Wer Tasten einzeln abfragt, bindet ein Skript an die Tastatur. Eine Aktion benennt stattdessen, was der Spieler tut, und das Projekt legt fest, welche Tasten, Sticks und Knöpfe sie auslösen. Ein neues Unity-6-Projekt enthält eine Reihe solcher Aktionen (das Asset InputSystem_Actions, das als projektweite Aktionen festgelegt ist). Seine Player-Map enthält Move (WASD, die Pfeiltasten und der linke Stick eines Gamepads), Look (die Maus oder der rechte Stick), Attack (die linke Maustaste und Enter), Interact (E, gedrückt halten), Crouch (C), Jump (Leertaste und die südliche Taste des Gamepads), Previous und Next (1 und 2) sowie Sprint (Left Shift). Sie sind von Anfang an aktiviert, und InputSystem.actions.FindAction("Jump") ruft eine anhand ihres Namens ab. Dieser seitlich dargestellte Klauenkran bewegt sich auf x und y und greift bei Jump zu:

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!");
    }
}

Die Aktionen werden einmal in Start abgerufen und in InputAction-Feldern gespeichert. Move liefert einen Vector2: x steht für rechts und links, y für oben und unten auf den Tasten. Der Wert ist normalisiert, sodass W und D zusammen (0.71, 0.71) statt (1, 1) ergeben. Der Kran wird von der Seite betrachtet, also verwendet er y für die Höhe; ein Spiel aus der Vogelperspektive würde dafür z verwenden. Tastenaktionen funktionieren wie Tasten: WasPressedThisFrame(), WasReleasedThisFrame() und IsPressed(). Zwei Fehler führen zu Ausnahmen: Bei einem falsch geschriebenen Namen gibt FindAction null zurück (beim ersten Lesezugriff tritt eine NullReferenceException auf), und ReadValue<Vector3>() bei Move löst eine InvalidOperationException aus, sobald eine Taste gedrückt wird, weil Move einen Vector2 enthält.

challenge icon

Aufgabe

Mittel

Bewege den Landvermesser und pflanze mit den Aktionen des Projekts Flaggen.

  1. Setze in Start() moveAction, jumpAction und attackAction mit InputSystem.actions.FindAction("Move"), "Jump" und "Attack".
  2. Bewege dich in Update() mit moveAction.ReadValue<Vector2>() multipliziert mit speed; die y-Komponente verläuft entlang der z-Achse.
  3. Rufe Plant() auf, wenn jumpAction.WasPressedThisFrame() gilt, und bei einem Druck auf Attack PullUp().

Drücke „Spielen“, pflanze drei Flaggen und klicke, um eine wieder aus dem Boden zu ziehen. Klicke dann auf „Prüfen“.

Probier es selbst

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()
    {
        // die Aktionen Move, Jump und Attack finden
    }

    void Update()
    {
        // mit Move laufen, bei Drücken von Jump Plant() aufrufen und bei Drücken von Attack PullUp() aufrufen
    }

    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);
    }
}

Alle Lektionen in Echte Spiele entwickeln

Übe selbstständig: Unity-Playground