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.
Aufgabe
MittelBewege den Landvermesser und pflanze mit den Aktionen des Projekts Flaggen.
- Setze in
Start()moveAction,jumpActionundattackActionmitInputSystem.actions.FindAction("Move"),"Jump"und"Attack". - Bewege dich in
Update()mitmoveAction.ReadValue<Vector2>()multipliziert mitspeed; die y-Komponente verläuft entlang der z-Achse. - Rufe
Plant()auf, wennjumpAction.WasPressedThisFrame()gilt, und bei einem Druck auf AttackPullUp().
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
1Text auf dem Bildschirm
Canvas und TextPunktestand anzeigenZahlen formatierenEin Countdown-TimerRückblick: Tachometer2Buttons und Bildschirme
Buttons und onClickLambdasVerknüpfungen im InspectorPanels ein- und ausblendenGesundheitsbalkenRückblick: Upgrade-Shop5Speichern mit PlayerPrefs
Eine Zahl speichernMit einem Standardwert ladenHöchstpunktzahlEinstellungen speichernRückblick: Münzen auf der Bank3Der Spielmanager
Ein Skript steuert das SpielDas SingletonSpielzuständeZum Zustand wechselnRückblick: Rundenmanager6Projekt: Endlosläufer
Drei SpurenHindernisse voraus9Das neue Eingabesystem
Zwei EingabesystemeTastatur und MausIn diesem Frame gedrücktEingabeaktionenRückblick: EingabewechselÜbe selbstständig: Unity-Playground