Unity Events

Unity Events Ă€r en variation pĂ„ samma designmönster som C# delegater. En hĂ€ndelse – en "event" – knyts till en eller flera metoder. SĂ„ nĂ€r hĂ€ndelsen aktiveras, sĂ„ körs alla metoder som kopplats till den.

Skillnaden mellan Events och delegater Àr att med Events sker anknytningen mellan hÀndelse och metoder i första hand via Unity-editorns grÀnssnitt snarare Àn med kod.

MÄnga system i Unity anvÀnder Events som ett sÀtt att bygga logik direkt i editorn. UI-systemet anvÀnder till exempel Events för att knyta knapptryck till metodanrop, utan att den som designar grÀnssnittet behöver skriva nÄgon kod.

I editorn

Bilden ovan visar tre exempel pĂ„ UnityEvents som visas i Unity-editorn. Det första eventet har Ă€nnu inga metoder kopplade till sig – listan Ă€r tom. Listan utökas genom knappen +.

För att koppla en metod till ett Event behövs tre eller fyra bitar information:

  • NĂ€r eventet ska vara aktivt – normalt "Runtime only", alltsĂ„ att eventet bara kan aktiveras nĂ€r spelet körs.

  • Objektet som innehĂ„ller den komponent vars metod ska anropas.

  • Komponenten och metoden som ska anropas.

  • Eventuellt: en parameter som skickas in i metoden nĂ€r den anropas.

Eventet "Normal Event" i exemplet anropar metoden SayHello pÄ komponenten Hello, som i sin tur befinner sig i objektet TestObject.

Eventet "String Event" anropar istÀllet metoden SaySomething, med parametern "What is Love?", pÄ samma komponent (Hello) och samma objekt (TestObject).

Objektet behöver vÀljas först, dÀrefter komponenten, metoden och det eventuella parametervÀrdet.

UnityEvent

UnityEvent Àr datatypen för unity events. För att anvÀnda den behöver man ocksÄ inkludera UnityEngine.Events.

UnityEventTest.cs
using UnityEngine;
using UnityEngine.Events;

public class UnityEventTest : MonoBehaviour
{
  [SerializeField]
  UnityEvent jumpEvent;
}

Invoke()

Aktiverar eventet – det vill sĂ€ga, kör alla metoder som knutits till det.

private void Update() {
  if (Input.GetAxisRaw("Jump") > 0)
  {
    jumpEvent.Invoke();
  }
}

AddListener()

Normalt anvÀnds Unity-grÀnssnittet för att lÀgga till metoder som ska anropas nÀr eventet aktiveras, men man kan ocksÄ göra det i kod via AddListener().

private void Start() {
  jumpEvent.AddListener(Jump);
}

private void Jump()
{
  GetComponent<Rigidbody2D>().AddForce(Vector2.up * 1000);
}

UnityEvent<>

För att skapa events som skickar parametervÀrden till sina metoder, och vars metoder tar emot parametervÀrden, lÀggs parametrarnas datatyp till mellan < och >.

using UnityEngine;
using UnityEngine.Events;

public class UnityEventTest : MonoBehaviour
{
  [SerializeField]
  UnityEvent<int> powerUpEvent; // Man kan bara lÀgga till metoder som tar emot integers

  private void Start()
  {
    powerUpEvent.AddListener(PowerUp);
  }

  private void Update()
  {
    if (Input.GetAxisRaw("PowerUp") > 0)
    {
      powerUpEvent.Invoke(9001); // Kör alla metoder, skicka in 9001 som parametervÀrde
    }
  }

  private void PowerUp(int amount)
  {
    print("Powering up " + amount + "!");
  }
}

Last updated