111 lines
2.8 KiB
C#
111 lines
2.8 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
namespace Stary.Evo
|
|
{
|
|
|
|
/// <summary>
|
|
/// 用于注销的接口(为了防止注册后忘记注销特实现此接口)
|
|
/// </summary>
|
|
public interface IUnRegister
|
|
{
|
|
void UnRegister();
|
|
}
|
|
public interface IUnRegisterList
|
|
{
|
|
List<IUnRegister> 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();
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// 自定义可注销的类
|
|
/// </summary>
|
|
public struct CustomUnRegister : IUnRegister
|
|
{
|
|
/// <summary>
|
|
/// 委托对象
|
|
/// </summary>
|
|
private Action mOnUnRegister { get; set; }
|
|
|
|
/// <summary>
|
|
/// 带参构造函数
|
|
/// </summary>
|
|
/// <param name="onDispose"></param>
|
|
public CustomUnRegister(Action onUnRegsiter)
|
|
{
|
|
mOnUnRegister = onUnRegsiter;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 资源释放
|
|
/// </summary>
|
|
public void UnRegister()
|
|
{
|
|
mOnUnRegister.Invoke();
|
|
mOnUnRegister = null;
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// 注销的触发器
|
|
/// </summary>
|
|
public class UnRegisterOnDestroyTrigger : MonoBehaviour
|
|
{
|
|
private HashSet<IUnRegister> mUnRegisters = new HashSet<IUnRegister>();
|
|
|
|
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();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 注销触发器的使用简化
|
|
/// </summary>
|
|
public static class UnRegisterExtension
|
|
{
|
|
public static IUnRegister UnRegisterWhenGameObjectDestroyed(this IUnRegister unRegister, GameObject gameObject)
|
|
{
|
|
var trigger = gameObject.GetComponent<UnRegisterOnDestroyTrigger>()??null;
|
|
|
|
if (!trigger)
|
|
{
|
|
trigger = gameObject.AddComponent<UnRegisterOnDestroyTrigger>();
|
|
}
|
|
|
|
trigger.AddUnRegister(unRegister);
|
|
|
|
return unRegister;
|
|
}
|
|
}
|
|
|
|
} |