Unity - Events
Updated at 2016-10-30 07:45
- Use C# delegates if you only control the listeners in code.
- Use Unity events if you want to control the listeners in code AND editor.
- Don't use
SendMessage
messaging system, it's legacy crap.
C# delegates:
using System;
using UnityEngine;
public class Clock : MonoBehaviour
{
public event Action TickBefore = delegate {};
public event Action<float> TickAfter = delegate {};
private void Start()
{
StartCoroutine(Timer());
}
private IEnumerator Timer()
{
var total = 0.0f;
while (true) {
TickBefore();
return yield WaitForSeconds(1.0f);
total += 1.0f;
TickAfter(total);
}
}
}
using System;
using UnityEngine;
public class TickTock: MonoBehaviour
{
public GameObject clock;
private void OnEnable()
{
clock.TickBefore += OnTickBefore;
clock.TickAfter += OnTickAfter;
}
private void OnDisable()
{
// TODO: Check if application is quitting.
clock.TickBefore -= OnTickBefore;
clock.TickAfter -= OnTickAfter;
}
private void OnTickBefore()
{
Debug.Log("Tick");
}
private void OnTickAfter(float total)
{
Debug.Log("Tock");
}
}
Unity events:
using UnityEngine;
using UnityEngine.Events;
public class Eventor : MonoBehaviour
{
public UnityEvent WaitAfter = new UnityEvent();
private void Start()
{
StartCoroutine(Timer());
WaitAfter.AddListener(OnWaitAfter);
}
private IEnumerator Timer()
{
yield return new WaitForSeconds(1.0f);
WaitAfter.Invoke();
WaitAfter.RemoveListener(OnWaitAfter);
WaitAfter.RemoveAllListeners();
WaitAfter.Invoke();
}
private void OnWaitAfter()
{
Debug.Log("Hello world!");
}
}
Name events consistently. Personally I name them SubjectVerbWhen
where the verb is always in present.
UpdateBefore
UpdateAfter
TitleChangeBefore
TitleChangeAfter