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.

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.

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.
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>