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;
}
}
}