In C# kan je gebruik maken van events. Bij het gebruiken van Events heb je altijd een publisher en een subscriber.

<aside> 💡

Publisher is de Event eigenaar en geeft een signaal wanneer het event afgevuurd is.

Subscriber luistert of het event af gaat en gebruikt dit als trigger om iets te doen.

</aside>

De publisher heeft geen idee dat er een of meer subscribers zijn. Hierdoor is de publisher ook niet afhankelijk of deze wel bestaan of niet en werkt deze dus altijd.

image.png

Een voorbeeld:

Ik wil dat er een particle afgaat wanneer de player level up gaat. Ik wil niet een directe link naar dit effect en ik wil het effect gemakkelijke kunnen aanpassen.

De publisher (player) heeft hier een event “OnLevelUp” dat afgaat wanneer de player genoeg XP heeft gehaald.

De subscriber is het effectScript dat verschillende effecten beheert voor verschillende situaties waaronder levelup.

image.png

Wanneer het OnLevelUp event afgaat zal het effectscript het levelup effect starten. Het is dus niet zo dat het Playerscript waar het event bestaat de method op het effectscript uitvoert maar anders om. Het effectscript kijkt naar het playerscript of OnlevelUp event is gebeurt en voert dan zelf zijn eigen method uit.


Code voorbeeld

using System;
using UnityEngine;

public class EventsTest : MonoBehaviour
{
    public event EventHandler OnLevelUp;

    // Start is called before the first frame update
    void Start()
    {
		    //subscribe aan het event met de method Test_OnLevelUp
        OnLevelUp += Test_OnLevelUp;
    }

    private void Test_OnLevelUp(object sender, EventArgs e)
    {
        Debug.Log("Ding! Level Up");
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            //Event aanroepen is hetzeflde als een method
            OnLevelUp(this, EventArgs.Empty);

            //Als er geen subs zijn krijg je een null reff error 
            //dus je moet een null check doen:
            if (OnLevelUp != null)
            {
                OnLevelUp(this, EventArgs.Empty);
            }

            // andere manier van schrijven.
            if (OnLevelUp != null) OnLevelUp(this, EventArgs.Empty);

            // andere manier van schrijven.
            OnLevelUp?.Invoke(this, EventArgs.Empty);

        }
    }    
}

In dit voorbeeld zie je hoe een event wordt aangemaakt, aanroept en hoe je subscribed aan een event. Dus wanneer je LevelUp bent door op de spatie te drukken gaat het event af en wordt de code uitgevoerd die in de private void Test_OnLevelUp(object sender, EventArgs e) staat.

Dit zit nu allemaal in dezelfde class maar je wil dit natuurlijk via een andere class kunnen gebruiken. Hieronder zie je hoe je in een andere class de subscription kan doen. Hiervoor heb je een referentie nodig naar het script waar het event zich bevindt.

using UnityEngine;

public class EventSub : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
		    // refferentie naar de EventsTest class
        EventsTest eventTest = GetComponent<EventsTest>();
        
        // subscribe to OnLevelUp Event
        eventTest.OnLevelUp += EventTest_OnLevelUp;
    }
		
		// uit te voeren method wanneer event af gaat.
    private void EventTest_OnLevelUp(object sender, System.EventArgs e)
    {
        Debug.Log("Ding! Level Up");
        
        // UNsubscribe to OnLevelUp Event
        eventTest.OnLevelUp -= EventTest_OnLevelUp;
    }
}

In de method zie je ook nog hoe je Unsubscribed van een Event met “-=”.

<aside> 💡

In de voorbeelden wordt gebruik gemaakt van event EventHandler Dit is de C# .Net standaard event handler en dit een een delegate. Dus wanneer je een event wil aanmaken kan je iedere delegate gebruiken die je wil. er zijn er een paar standaard beschikbaar: EventHandler of Action

</aside>