// Copyright (c) Pixel Crushers. All rights reserved. using UnityEngine; using UnityEngine.Events; namespace PixelCrushers { /// /// Invokes an event when the component is disabled or destroyed. /// If you don't want to invoke the event when the component is disabled /// and destroyed by a scene change, call SceneNotifier.NotifyWillUnloadScene(). /// [AddComponentMenu("")] // Use wrapper. public class DisappearEvent : MonoBehaviour { public enum EventTrigger { OnDisable, OnDestroy } [Tooltip("Run the event when this happens.")] [SerializeField] private EventTrigger m_eventTrigger = EventTrigger.OnDestroy; [SerializeField] private UnityEvent m_onDisappeared = new UnityEvent(); /// /// Run the event when this happens. /// public EventTrigger eventTrigger { get { return m_eventTrigger; } set { m_eventTrigger = value; } } public UnityEvent onDisappeared { get { return m_onDisappeared; } set { m_onDisappeared = value; } } private bool m_ignore = false; private void OnEnable() { SceneNotifier.willUnloadScene -= OnWillUnload; SceneNotifier.willUnloadScene += OnWillUnload; } private void OnDisable() { SceneNotifier.willUnloadScene -= OnWillUnload; if (!m_ignore && eventTrigger == EventTrigger.OnDisable) { RunEvent(); } } private void OnDestroy() { if (!m_ignore && eventTrigger == EventTrigger.OnDestroy) { RunEvent(); } } public void RunEvent() { onDisappeared.Invoke(); } public void OnWillUnload(int sceneIndex) { m_ignore = true; } private void OnApplicationQuit() { m_ignore = true; } } }