using System; using System.Collections.Generic; using UnityEngine; namespace Stary.Evo { /// /// 用于注销的接口(为了防止注册后忘记注销特实现此接口) /// public interface IUnRegister { void UnRegister(); } public interface IUnRegisterList { List UnregisterList { get; } } public static class IUnRegisterListExtension { public static void AddToUnregisterList(this IUnRegister self, IUnRegisterList unRegisterList) { unRegisterList.UnregisterList.Add(self); } public static void UnRegisterAll(this IUnRegisterList self) { foreach (var unRegister in self.UnregisterList) { unRegister.UnRegister(); } self.UnregisterList.Clear(); } } /// /// 自定义可注销的类 /// public struct CustomUnRegister : IUnRegister { /// /// 委托对象 /// private Action mOnUnRegister { get; set; } /// /// 带参构造函数 /// /// public CustomUnRegister(Action onUnRegsiter) { mOnUnRegister = onUnRegsiter; } /// /// 资源释放 /// public void UnRegister() { mOnUnRegister.Invoke(); mOnUnRegister = null; } } /// /// 注销的触发器 /// public class UnRegisterOnDestroyTrigger : MonoBehaviour { private HashSet mUnRegisters = new HashSet(); public void AddUnRegister(IUnRegister unRegister) { mUnRegisters.Add(unRegister); } public void RemoveUnRegister(IUnRegister unRegister) { mUnRegisters.Remove(unRegister); } private void OnDestroy() { foreach (var unRegister in mUnRegisters) { unRegister.UnRegister(); } mUnRegisters.Clear(); } } /// /// 注销触发器的使用简化 /// public static class UnRegisterExtension { public static IUnRegister UnRegisterWhenGameObjectDestroyed(this IUnRegister unRegister, GameObject gameObject) { var trigger = gameObject.GetComponent()??null; if (!trigger) { trigger = gameObject.AddComponent(); } trigger.AddUnRegister(unRegister); return unRegister; } } }