using NUnit.Framework; using UnityEditor.Events; using UnityEngine; using UnityEngine.Events; public class UnityEventInvoke { class SimpleCounter : MonoBehaviour { public int m_Count = 0; public void Add() { ++m_Count; } public void NoOp(int i) { } } GameObject m_CounterObject; SimpleCounter Counter { get; set; } [SetUp] public void TestSetup() { m_CounterObject = new GameObject("Counter"); Counter = m_CounterObject.AddComponent(); } [TearDown] public void TearDown() { GameObject.DestroyImmediate(m_CounterObject); } [Test] [Description("Using a CachedInvokableCall in a UnityEvent should not go re-trigger all the calls stored in the UnityEvent. Case-950588")] public void UnityEvent_InvokeCallsListenerOnce() { var _event = new UnityEvent(); UnityEventTools.AddPersistentListener(_event, new UnityAction(Counter.Add)); _event.SetPersistentListenerState(0, UnityEventCallState.EditorAndRuntime); _event.Invoke(); Assert.AreEqual(1, Counter.m_Count); for (int i = 1; i < 5; ++i) { UnityEventTools.AddIntPersistentListener(_event, new UnityAction(Counter.NoOp), i); _event.SetPersistentListenerState(i, UnityEventCallState.EditorAndRuntime); } _event.Invoke(); Assert.AreEqual(2, Counter.m_Count); } [Test] [Description("Using a CachedInvokableCall in a UnityEvent should not go re-trigger all the calls stored in the UnityEvent. Case-950588")] public void UnityEvent_EditMode_InvokeDoesNotCallRuntimeListener() { var _event = new UnityEvent(); UnityEventTools.AddPersistentListener(_event, new UnityAction(Counter.Add)); Assert.AreEqual(UnityEventCallState.RuntimeOnly, _event.GetPersistentListenerState(0)); Assert.False(Application.isPlaying); _event.Invoke(); Assert.AreEqual(0, Counter.m_Count, "Expected Event to not be called when not in play mode and event is marked as Runtime only"); for (int i = 1; i < 5; ++i) { UnityEventTools.AddIntPersistentListener(_event, new UnityAction(Counter.NoOp), i); } _event.Invoke(); Assert.AreEqual(0, Counter.m_Count, "Expected Event to not be called when not in play mode and event is marked as Runtime only"); } }