Action-based Input System

Unity har ett nytt input-system. För att aktivera det, gÄ till Package manager och lÀgg till Input System till projektet.

(Vidare lÀsning: Complete guide to the new system)

Det enklaste sÀttet att börja arbeta med det hÀr systemet Àr via en Player Input-komponent.

Sammanfattning:

  • Player Input-komponenten kopplar ihop en Input Action Asset med spelets övriga kod.

  • En Input Action Asset bestĂ„r av en eller flera Action Maps.

  • Varje Action Map beskriver en uppsĂ€ttning kontroller för en del av ett spel (t.ex. bĂ„tsekvenser, eller plattformshoppande). Och bestĂ„r av ett antal Input Actions.

  • En Input Action kopplar ihop vissa knapptryck (t.ex. mellanslag och A pĂ„ handkontroll) med ett vĂ€rde med specifierad datatyp (t.ex. float). "Movement" kan vara en Input Action, medan WASD Ă€r ett sĂ€tt att mata Movement med data.

Man kan arbeta antingen separat med enskilda Input Actions, eller sÄ kan man jobba mer övergripande med Input Action Assets och lÄta Unitys system hantera mer av strukturen.

InputAction

Grunden till det nya systemet Àr InputActions. En InputAction knyter ihop knappar och andra inputs till vÀrden. Detta kallas bindings.

Exempel: En Movement-InputAction som knyter WASD och en handkontrolls vÀnstra analoga styrspak till en 2D-vektor med X- och Y-vÀrden.

Det gÄr att lÀgga till en InputAction direkt i ett script, och dÄ knyta knappar etc till denna action via grÀnssnittet i Unitys inspector.

Glöm inte using UnityEngine.InputSystem högst upp!

using UnityEngine.InputSystem;

public class PlayerController : MonoBehaviour
{
  public InputAction moveAction;
  
  private void Awake()
  {
    moveAction.Enable(); // OBS!
  }
}

Innan en InputAction börjar fungera mÄste dess Enable()-metod först anropas.

I Inspectorn lÀgger man sedan till nya bindings med plus-knappen. Man bestÀmmer vilken typ av vÀrde InputActionen ska ge ifrÄn sig genom att klicka pÄ kugghjulet.

ReadValue<>

AnvÀnds för att lÀsa av en InputActions vÀrde. Datatypen anges mellan <>. Om ingen binding har rÀtt datatyp, returneras ett nollvÀrde.

  void Update()
  {
    Vector2 movement = moveAction.ReadValue<Vector2>();
    
    transform.Translate(movement * speed * Time.deltaTime;
  }

Actions

Started anropas normalt sett nÀr input pÄbörjas och canceled nÀr input avslutas, sÄ de Àr lÀtta att anvÀnda för att koppla kod till nÀr en knapp till exempel trycks ner (started) eller slÀpps upp (canceled). Performed Àr mer komplicerad och nÀr den anropas beror pÄ vilken sorts InputAction det rör sig om (Value eler Button t.ex).

InputAction.CallbackContext-parametern innehÄller information om den InputAction-hÀndelse som anropade metoden, sÄ man kan koppla samma metod till flera Actions och ÀndÄ göra skillnad i vad som hÀnder.

  void Awake()
  {
    fireAction.Enable();
    fireAction.started += OnFireStart;
    fireAction.canceled += OnFireEnd;
  }
  
  void OnFireStart(InputAction.CallbackContext context)
  {
    // Börja ladda upp skottet
  }
  
  void OnFireEnd(InputAction.CallbackContext context)
  {
    // Avfyra skottet
  }

Input Action assets

En InputAction asset samlar ett flertal ActionAssets pÄ ett och samma stÀlle. Man skapar en sÄdan genom att högerklicka i Assets och vÀlja Create -> Input Actions.

En InputAction asset Àr tÀnkt att samla en spelares inputs. Har man flera spelare, sÄ skapar man en asset per spelare för att hÄlla isÀr deras kontroller.

Action Maps

AnvÀnds för att separera kontrollerna för olika delar av spelet. Man kan till exempel ha en Action Map för menyer och en för sjÀlva spelet. I spel dÀr man ibland kör fordon och ibland springer omkring som ensam person kan Action Maps separera styrningen för de olika sekvenserna.

Varje Action Map innehÄller ett antal InputActions. De har samma tillval som andra InputActions.

Control Schemes

Control Schemes Àr sÀtt att gruppera och filtrera bindings i en InputAction asset. Till exempel kan projektet ha Control Schemes för tangentbord+mus, handkontroll och touchscreen.

InputAction assets i kod

LÀgg till en InputActionAsset-variabel och gör sÄ att den syns i inspectorn. AnvÀnd Unitys grÀnssnitt för att vÀlja vilken asset som ska anvÀndas av scriptet.

Genom att anropa assetens Enable-metod sÄ aktiveras den som helhet. Enskilda InputActions behöver inte aktiveras manuellt.

using UnityEngine.InputSystem;

public class PlayerController : MonoBehaviour
{
  public InputActionAsset actionAsset;
  
  private void Awake()
  {
    actionAsset.Enable();
  }
}

FindAction()

Metoden FindAction tar emot namnet pÄ en InputAction som parameter och returnerar denna InputAction om den hittas i InputAction asseten som den anropas i.

  private void Awake()
  {
    actionAsset.Enable();
    InputAction fireAction = actionAsset.FindAction("Fire");
    
    fireAction.started += OnFireStart;
    fireAction.canceled += OnFireEnd;
  }

Player Input

PlayerInput Àr en komponent för att enkelt knyta ihop en InputAction Asset med kod som t.ex. flyttar pÄ spelarkaraktÀren.

Om ingen Input Action Asset Ă€r vald, finns en knapp för att skapa en. Den som dĂ„ skapas har tre Actions redan inlagda – Move, Look och Fire. Man kan enkelt lĂ€gga till flera, eller ta bort de man inte behöver, men det Ă€r i varje fall en ganska bra grund att utgĂ„ frĂ„n.

Default Scheme och Default Map Àr det control scheme och den action map som anvÀnds som standard. Ofta behöver man inte Àndra pÄ dem alls.

Behavior Àr det sÀtt Player Input-komponenten anvÀnder för att kommunicera med andra scripts. Send Messages Àr antagligen det enklaste.

Send Messages

Om en scriptkomponent pÄ samma spelobjekt som Player Input har metoder som Àr döpta pÄ rÀtt sÀtt, sÄ kommer de metoderna att anropas nÀr spelaren trycker pÄ knappar eller drar i analoga spakar. I en normal Input Action Asset finns till exempel en Action som heter Move. NÀr spelaren trycker pÄ, eller slÀpper upp, nÄgon av knapparna eller spakarna som Àr knuten till denna Action, sÄ körs OnMove-metoden om den finns.

public class AvatarController : MonoBehaviour
{
  void OnMove()
  {
    print("Moving!");
  }
}

LÀsa av input-vÀrden

För att lÀsa av exakt vilket vÀrde en knapp eller spak har, till exempel för förflyttning, sÄ kan man lÀgga till en InputValue-parameter till de metoder som anropas av Send Message-systemet.

FrÄn ett InputValue-objekt kan man sedan fÄ ut Vector2 eller float eller bool, beroende pÄ vilken typ av data som skickas av motsvarande Action. Move har ofta en Vector2 som Action Type, till exempel.

using UnityEngine;
using UnityEngine.InputSystem;

public class AvatarController : MonoBehaviour
{

  [SerializeField]
  float speed = 2;

  Vector2 movement = new Vector2();

  void Update()
  {
    transform.Translate(movement * speed * Time.deltaTime);
  }

  void OnMove(InputValue value)
  {
    movement = value.Get<Vector2>();
  }
}

Last updated