DESKTOP-B25GA9E\W35
2 years ago
7 changed files with 43 additions and 983 deletions
@ -1,925 +0,0 @@
@@ -1,925 +0,0 @@
|
||||
/**************************************************************************** |
||||
* Copyright (c) 2015 ~ 2022 liangxiegame MIT License |
||||
* |
||||
* QFramework v1.0 |
||||
* |
||||
* https://qframework.cn |
||||
* https://github.com/liangxiegame/QFramework |
||||
* https://gitee.com/liangxiegame/QFramework |
||||
* |
||||
* Author: |
||||
* liangxie https://github.com/liangxie |
||||
* soso https://github.com/so-sos-so |
||||
* |
||||
* Contributor |
||||
* TastSong https://github.com/TastSong |
||||
* 京产肠饭 https://gitee.com/JingChanChangFan/hk_-unity-tools |
||||
* 猫叔(一只皮皮虾) https://space.bilibili.com/656352/ |
||||
* |
||||
* Community |
||||
* QQ Group: 623597263 |
||||
* Latest Update: 2022.8.8 10:24 List=>HashSet |
||||
****************************************************************************/ |
||||
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
using UnityEngine; |
||||
|
||||
namespace QFramework |
||||
{ |
||||
#region Architecture |
||||
|
||||
public interface IArchitecture |
||||
{ |
||||
void RegisterSystem<T>(T system) where T : ISystem; |
||||
|
||||
void RegisterModel<T>(T model) where T : IModel; |
||||
|
||||
void RegisterUtility<T>(T utility) where T : IUtility; |
||||
|
||||
T GetSystem<T>() where T : class, ISystem; |
||||
|
||||
T GetModel<T>() where T : class, IModel; |
||||
|
||||
T GetUtility<T>() where T : class, IUtility; |
||||
|
||||
void SendCommand<T>() where T : ICommand, new(); |
||||
void SendCommand<T>(T command) where T : ICommand; |
||||
|
||||
TResult SendQuery<TResult>(IQuery<TResult> query); |
||||
|
||||
void SendEvent<T>() where T : new(); |
||||
void SendEvent<T>(T e); |
||||
|
||||
IUnRegister RegisterEvent<T>(Action<T> onEvent); |
||||
void UnRegisterEvent<T>(Action<T> onEvent); |
||||
} |
||||
|
||||
public abstract class Architecture<T> : IArchitecture where T : Architecture<T>, new() |
||||
{ |
||||
private bool mInited = false; |
||||
|
||||
private HashSet<ISystem> mSystems = new HashSet<ISystem>(); |
||||
|
||||
private HashSet<IModel> mModels = new HashSet<IModel>(); |
||||
|
||||
public static Action<T> OnRegisterPatch = architecture => { }; |
||||
|
||||
private static T mArchitecture; |
||||
|
||||
public static IArchitecture Interface |
||||
{ |
||||
get |
||||
{ |
||||
if (mArchitecture == null) |
||||
{ |
||||
MakeSureArchitecture(); |
||||
} |
||||
|
||||
return mArchitecture; |
||||
} |
||||
} |
||||
|
||||
|
||||
static void MakeSureArchitecture() |
||||
{ |
||||
if (mArchitecture == null) |
||||
{ |
||||
mArchitecture = new T(); |
||||
mArchitecture.Init(); |
||||
|
||||
OnRegisterPatch?.Invoke(mArchitecture); |
||||
|
||||
foreach (var architectureModel in mArchitecture.mModels) |
||||
{ |
||||
architectureModel.Init(); |
||||
} |
||||
|
||||
mArchitecture.mModels.Clear(); |
||||
|
||||
foreach (var architectureSystem in mArchitecture.mSystems) |
||||
{ |
||||
architectureSystem.Init(); |
||||
} |
||||
|
||||
mArchitecture.mSystems.Clear(); |
||||
|
||||
mArchitecture.mInited = true; |
||||
} |
||||
} |
||||
|
||||
protected abstract void Init(); |
||||
|
||||
private IOCContainer mContainer = new IOCContainer(); |
||||
|
||||
public void RegisterSystem<TSystem>(TSystem system) where TSystem : ISystem |
||||
{ |
||||
system.SetArchitecture(this); |
||||
mContainer.Register<TSystem>(system); |
||||
|
||||
if (!mInited) |
||||
{ |
||||
mSystems.Add(system); |
||||
} |
||||
else |
||||
{ |
||||
system.Init(); |
||||
} |
||||
} |
||||
|
||||
public void RegisterModel<TModel>(TModel model) where TModel : IModel |
||||
{ |
||||
model.SetArchitecture(this); |
||||
mContainer.Register<TModel>(model); |
||||
|
||||
if (!mInited) |
||||
{ |
||||
mModels.Add(model); |
||||
} |
||||
else |
||||
{ |
||||
model.Init(); |
||||
} |
||||
} |
||||
|
||||
public void RegisterUtility<TUtility>(TUtility utility) where TUtility : IUtility |
||||
{ |
||||
mContainer.Register<TUtility>(utility); |
||||
} |
||||
|
||||
public TSystem GetSystem<TSystem>() where TSystem : class, ISystem |
||||
{ |
||||
return mContainer.Get<TSystem>(); |
||||
} |
||||
|
||||
public TModel GetModel<TModel>() where TModel : class, IModel |
||||
{ |
||||
return mContainer.Get<TModel>(); |
||||
} |
||||
|
||||
public TUtility GetUtility<TUtility>() where TUtility : class, IUtility |
||||
{ |
||||
return mContainer.Get<TUtility>(); |
||||
} |
||||
|
||||
public void SendCommand<TCommand>() where TCommand : ICommand, new() |
||||
{ |
||||
var command = new TCommand(); |
||||
ExecuteCommand(command); |
||||
} |
||||
|
||||
public void SendCommand<TCommand>(TCommand command) where TCommand : ICommand |
||||
{ |
||||
ExecuteCommand(command); |
||||
} |
||||
|
||||
protected virtual void ExecuteCommand(ICommand command) |
||||
{ |
||||
command.SetArchitecture(this); |
||||
command.Execute(); |
||||
} |
||||
|
||||
public TResult SendQuery<TResult>(IQuery<TResult> query) |
||||
{ |
||||
return DoQuery<TResult>(query); |
||||
} |
||||
|
||||
protected virtual TResult DoQuery<TResult>(IQuery<TResult> query) |
||||
{ |
||||
query.SetArchitecture(this); |
||||
return query.Do(); |
||||
} |
||||
|
||||
private TypeEventSystem mTypeEventSystem = new TypeEventSystem(); |
||||
|
||||
public void SendEvent<TEvent>() where TEvent : new() |
||||
{ |
||||
mTypeEventSystem.Send<TEvent>(); |
||||
} |
||||
|
||||
public void SendEvent<TEvent>(TEvent e) |
||||
{ |
||||
mTypeEventSystem.Send<TEvent>(e); |
||||
} |
||||
|
||||
public IUnRegister RegisterEvent<TEvent>(Action<TEvent> onEvent) |
||||
{ |
||||
return mTypeEventSystem.Register<TEvent>(onEvent); |
||||
} |
||||
|
||||
public void UnRegisterEvent<TEvent>(Action<TEvent> onEvent) |
||||
{ |
||||
mTypeEventSystem.UnRegister<TEvent>(onEvent); |
||||
} |
||||
} |
||||
|
||||
public interface IOnEvent<T> |
||||
{ |
||||
void OnEvent(T e); |
||||
} |
||||
|
||||
public static class OnGlobalEventExtension |
||||
{ |
||||
public static IUnRegister RegisterEvent<T>(this IOnEvent<T> self) where T : struct
|
||||
{ |
||||
return TypeEventSystem.Global.Register<T>(self.OnEvent); |
||||
} |
||||
|
||||
public static void UnRegisterEvent<T>(this IOnEvent<T> self) where T : struct
|
||||
{ |
||||
TypeEventSystem.Global.UnRegister<T>(self.OnEvent); |
||||
} |
||||
} |
||||
|
||||
#endregion |
||||
|
||||
#region Controller |
||||
|
||||
public interface IController : IBelongToArchitecture, ICanSendCommand, ICanGetSystem, ICanGetModel, |
||||
ICanRegisterEvent, ICanSendQuery |
||||
{ |
||||
} |
||||
|
||||
#endregion |
||||
|
||||
#region System |
||||
|
||||
public interface ISystem : IBelongToArchitecture, ICanSetArchitecture, ICanGetModel, ICanGetUtility, |
||||
ICanRegisterEvent, ICanSendEvent, ICanGetSystem |
||||
{ |
||||
void Init(); |
||||
} |
||||
|
||||
public abstract class AbstractSystem : ISystem |
||||
{ |
||||
private IArchitecture mArchitecture; |
||||
|
||||
IArchitecture IBelongToArchitecture.GetArchitecture() |
||||
{ |
||||
return mArchitecture; |
||||
} |
||||
|
||||
void ICanSetArchitecture.SetArchitecture(IArchitecture architecture) |
||||
{ |
||||
mArchitecture = architecture; |
||||
} |
||||
|
||||
void ISystem.Init() |
||||
{ |
||||
OnInit(); |
||||
} |
||||
|
||||
protected abstract void OnInit(); |
||||
} |
||||
|
||||
#endregion |
||||
|
||||
#region Model |
||||
|
||||
public interface IModel : IBelongToArchitecture, ICanSetArchitecture, ICanGetUtility, ICanSendEvent |
||||
{ |
||||
void Init(); |
||||
} |
||||
|
||||
public abstract class AbstractModel : IModel |
||||
{ |
||||
private IArchitecture mArchitecturel; |
||||
|
||||
IArchitecture IBelongToArchitecture.GetArchitecture() |
||||
{ |
||||
return mArchitecturel; |
||||
} |
||||
|
||||
void ICanSetArchitecture.SetArchitecture(IArchitecture architecture) |
||||
{ |
||||
mArchitecturel = architecture; |
||||
} |
||||
|
||||
void IModel.Init() |
||||
{ |
||||
OnInit(); |
||||
} |
||||
|
||||
protected abstract void OnInit(); |
||||
} |
||||
|
||||
#endregion |
||||
|
||||
#region Utility |
||||
|
||||
public interface IUtility |
||||
{ |
||||
} |
||||
|
||||
#endregion |
||||
|
||||
#region Command |
||||
|
||||
public interface ICommand : IBelongToArchitecture, ICanSetArchitecture, ICanGetSystem, ICanGetModel, ICanGetUtility, |
||||
ICanSendEvent, ICanSendCommand, ICanSendQuery |
||||
{ |
||||
void Execute(); |
||||
} |
||||
|
||||
public abstract class AbstractCommand : ICommand |
||||
{ |
||||
private IArchitecture mArchitecture; |
||||
|
||||
IArchitecture IBelongToArchitecture.GetArchitecture() |
||||
{ |
||||
return mArchitecture; |
||||
} |
||||
|
||||
void ICanSetArchitecture.SetArchitecture(IArchitecture architecture) |
||||
{ |
||||
mArchitecture = architecture; |
||||
} |
||||
|
||||
void ICommand.Execute() |
||||
{ |
||||
OnExecute(); |
||||
} |
||||
|
||||
protected abstract void OnExecute(); |
||||
} |
||||
|
||||
#endregion |
||||
|
||||
#region Query |
||||
|
||||
public interface IQuery<TResult> : IBelongToArchitecture, ICanSetArchitecture, ICanGetModel, ICanGetSystem, |
||||
ICanSendQuery |
||||
{ |
||||
TResult Do(); |
||||
} |
||||
|
||||
public abstract class AbstractQuery<T> : IQuery<T> |
||||
{ |
||||
public T Do() |
||||
{ |
||||
return OnDo(); |
||||
} |
||||
|
||||
protected abstract T OnDo(); |
||||
|
||||
|
||||
private IArchitecture mArchitecture; |
||||
|
||||
public IArchitecture GetArchitecture() |
||||
{ |
||||
return mArchitecture; |
||||
} |
||||
|
||||
public void SetArchitecture(IArchitecture architecture) |
||||
{ |
||||
mArchitecture = architecture; |
||||
} |
||||
} |
||||
|
||||
#endregion |
||||
|
||||
#region Rule |
||||
|
||||
public interface IBelongToArchitecture |
||||
{ |
||||
IArchitecture GetArchitecture(); |
||||
} |
||||
|
||||
public interface ICanSetArchitecture |
||||
{ |
||||
void SetArchitecture(IArchitecture architecture); |
||||
} |
||||
|
||||
public interface ICanGetModel : IBelongToArchitecture |
||||
{ |
||||
} |
||||
|
||||
public static class CanGetModelExtension |
||||
{ |
||||
public static T GetModel<T>(this ICanGetModel self) where T : class, IModel |
||||
{ |
||||
return self.GetArchitecture().GetModel<T>(); |
||||
} |
||||
} |
||||
|
||||
public interface ICanGetSystem : IBelongToArchitecture |
||||
{ |
||||
} |
||||
|
||||
public static class CanGetSystemExtension |
||||
{ |
||||
public static T GetSystem<T>(this ICanGetSystem self) where T : class, ISystem |
||||
{ |
||||
return self.GetArchitecture().GetSystem<T>(); |
||||
} |
||||
} |
||||
|
||||
public interface ICanGetUtility : IBelongToArchitecture |
||||
{ |
||||
} |
||||
|
||||
public static class CanGetUtilityExtension |
||||
{ |
||||
public static T GetUtility<T>(this ICanGetUtility self) where T : class, IUtility |
||||
{ |
||||
return self.GetArchitecture().GetUtility<T>(); |
||||
} |
||||
} |
||||
|
||||
public interface ICanRegisterEvent : IBelongToArchitecture |
||||
{ |
||||
} |
||||
|
||||
public static class CanRegisterEventExtension |
||||
{ |
||||
public static IUnRegister RegisterEvent<T>(this ICanRegisterEvent self, Action<T> onEvent) |
||||
{ |
||||
return self.GetArchitecture().RegisterEvent<T>(onEvent); |
||||
} |
||||
|
||||
public static void UnRegisterEvent<T>(this ICanRegisterEvent self, Action<T> onEvent) |
||||
{ |
||||
self.GetArchitecture().UnRegisterEvent<T>(onEvent); |
||||
} |
||||
} |
||||
|
||||
public interface ICanSendCommand : IBelongToArchitecture |
||||
{ |
||||
} |
||||
|
||||
public static class CanSendCommandExtension |
||||
{ |
||||
public static void SendCommand<T>(this ICanSendCommand self) where T : ICommand, new() |
||||
{ |
||||
self.GetArchitecture().SendCommand<T>(); |
||||
} |
||||
|
||||
public static void SendCommand<T>(this ICanSendCommand self, T command) where T : ICommand |
||||
{ |
||||
self.GetArchitecture().SendCommand<T>(command); |
||||
} |
||||
} |
||||
|
||||
public interface ICanSendEvent : IBelongToArchitecture |
||||
{ |
||||
} |
||||
|
||||
public static class CanSendEventExtension |
||||
{ |
||||
public static void SendEvent<T>(this ICanSendEvent self) where T : new() |
||||
{ |
||||
self.GetArchitecture().SendEvent<T>(); |
||||
} |
||||
|
||||
public static void SendEvent<T>(this ICanSendEvent self, T e) |
||||
{ |
||||
self.GetArchitecture().SendEvent<T>(e); |
||||
} |
||||
} |
||||
|
||||
public interface ICanSendQuery : IBelongToArchitecture |
||||
{ |
||||
} |
||||
|
||||
public static class CanSendQueryExtension |
||||
{ |
||||
public static TResult SendQuery<TResult>(this ICanSendQuery self, IQuery<TResult> query) |
||||
{ |
||||
return self.GetArchitecture().SendQuery(query); |
||||
} |
||||
} |
||||
|
||||
#endregion |
||||
|
||||
#region TypeEventSystem |
||||
|
||||
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; |
||||
} |
||||
} |
||||
|
||||
public class UnRegisterOnDestroyTrigger : MonoBehaviour |
||||
{ |
||||
private readonly 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(); |
||||
} |
||||
} |
||||
|
||||
public static class UnRegisterExtension |
||||
{ |
||||
public static IUnRegister UnRegisterWhenGameObjectDestroyed(this IUnRegister unRegister, GameObject gameObject) |
||||
{ |
||||
var trigger = gameObject.GetComponent<UnRegisterOnDestroyTrigger>(); |
||||
|
||||
if (!trigger) |
||||
{ |
||||
trigger = gameObject.AddComponent<UnRegisterOnDestroyTrigger>(); |
||||
} |
||||
|
||||
trigger.AddUnRegister(unRegister); |
||||
|
||||
return unRegister; |
||||
} |
||||
} |
||||
|
||||
public class TypeEventSystem |
||||
{ |
||||
private readonly EasyEvents mEvents = new EasyEvents(); |
||||
|
||||
|
||||
public static readonly TypeEventSystem Global = new TypeEventSystem(); |
||||
|
||||
public void Send<T>() where T : new() |
||||
{ |
||||
mEvents.GetEvent<EasyEvent<T>>()?.Trigger(new T()); |
||||
} |
||||
|
||||
public void Send<T>(T e) |
||||
{ |
||||
mEvents.GetEvent<EasyEvent<T>>()?.Trigger(e); |
||||
} |
||||
|
||||
public IUnRegister Register<T>(Action<T> onEvent) |
||||
{ |
||||
var e = mEvents.GetOrAddEvent<EasyEvent<T>>(); |
||||
return e.Register(onEvent); |
||||
} |
||||
|
||||
public void UnRegister<T>(Action<T> onEvent) |
||||
{ |
||||
var e = mEvents.GetEvent<EasyEvent<T>>(); |
||||
if (e != null) |
||||
{ |
||||
e.UnRegister(onEvent); |
||||
} |
||||
} |
||||
} |
||||
|
||||
#endregion |
||||
|
||||
#region IOC |
||||
|
||||
public class IOCContainer |
||||
{ |
||||
private Dictionary<Type, object> mInstances = new Dictionary<Type, object>(); |
||||
|
||||
public void Register<T>(T instance) |
||||
{ |
||||
var key = typeof(T); |
||||
|
||||
if (mInstances.ContainsKey(key)) |
||||
{ |
||||
mInstances[key] = instance; |
||||
} |
||||
else |
||||
{ |
||||
mInstances.Add(key, instance); |
||||
} |
||||
} |
||||
|
||||
public T Get<T>() where T : class
|
||||
{ |
||||
var key = typeof(T); |
||||
|
||||
if (mInstances.TryGetValue(key, out var retInstance)) |
||||
{ |
||||
return retInstance as T; |
||||
} |
||||
|
||||
return null; |
||||
} |
||||
} |
||||
|
||||
#endregion |
||||
|
||||
#region BindableProperty |
||||
|
||||
public interface IBindableProperty<T> : IReadonlyBindableProperty<T> |
||||
{ |
||||
new T Value { get; set; } |
||||
void SetValueWithoutEvent(T newValue); |
||||
} |
||||
|
||||
public interface IReadonlyBindableProperty<T> |
||||
{ |
||||
T Value { get; } |
||||
|
||||
IUnRegister RegisterWithInitValue(Action<T> action); |
||||
void UnRegister(Action<T> onValueChanged); |
||||
IUnRegister Register(Action<T> onValueChanged); |
||||
} |
||||
|
||||
public class BindableProperty<T> : IBindableProperty<T> |
||||
{ |
||||
public BindableProperty(T defaultValue = default) |
||||
{ |
||||
mValue = defaultValue; |
||||
} |
||||
|
||||
protected T mValue; |
||||
|
||||
public T Value |
||||
{ |
||||
get => GetValue(); |
||||
set |
||||
{ |
||||
if (value == null && mValue == null) return; |
||||
if (value != null && value.Equals(mValue)) return; |
||||
|
||||
SetValue(value); |
||||
mOnValueChanged?.Invoke(value); |
||||
} |
||||
} |
||||
|
||||
protected virtual void SetValue(T newValue) |
||||
{ |
||||
mValue = newValue; |
||||
} |
||||
|
||||
protected virtual T GetValue() |
||||
{ |
||||
return mValue; |
||||
} |
||||
|
||||
public void SetValueWithoutEvent(T newValue) |
||||
{ |
||||
mValue = newValue; |
||||
} |
||||
|
||||
private Action<T> mOnValueChanged = (v) => { }; |
||||
|
||||
public IUnRegister Register(Action<T> onValueChanged) |
||||
{ |
||||
mOnValueChanged += onValueChanged; |
||||
return new BindablePropertyUnRegister<T>() |
||||
{ |
||||
BindableProperty = this, |
||||
OnValueChanged = onValueChanged |
||||
}; |
||||
} |
||||
|
||||
public IUnRegister RegisterWithInitValue(Action<T> onValueChanged) |
||||
{ |
||||
onValueChanged(mValue); |
||||
return Register(onValueChanged); |
||||
} |
||||
|
||||
public static implicit operator T(BindableProperty<T> property) |
||||
{ |
||||
return property.Value; |
||||
} |
||||
|
||||
public override string ToString() |
||||
{ |
||||
return Value.ToString(); |
||||
} |
||||
|
||||
public void UnRegister(Action<T> onValueChanged) |
||||
{ |
||||
mOnValueChanged -= onValueChanged; |
||||
} |
||||
|
||||
public string Trim() |
||||
{ |
||||
throw new NotImplementedException(); |
||||
} |
||||
} |
||||
|
||||
public class BindablePropertyUnRegister<T> : IUnRegister |
||||
{ |
||||
public BindableProperty<T> BindableProperty { get; set; } |
||||
|
||||
public Action<T> OnValueChanged { get; set; } |
||||
|
||||
public void UnRegister() |
||||
{ |
||||
BindableProperty.UnRegister(OnValueChanged); |
||||
|
||||
BindableProperty = null; |
||||
OnValueChanged = null; |
||||
} |
||||
} |
||||
|
||||
#endregion |
||||
|
||||
#region EasyEvent |
||||
|
||||
public interface IEasyEvent |
||||
{ |
||||
} |
||||
|
||||
public class EasyEvent : IEasyEvent |
||||
{ |
||||
private Action mOnEvent = () => { }; |
||||
|
||||
public IUnRegister Register(Action onEvent) |
||||
{ |
||||
mOnEvent += onEvent; |
||||
return new CustomUnRegister(() => { UnRegister(onEvent); }); |
||||
} |
||||
|
||||
public void UnRegister(Action onEvent) |
||||
{ |
||||
mOnEvent -= onEvent; |
||||
} |
||||
|
||||
public void Trigger() |
||||
{ |
||||
mOnEvent?.Invoke(); |
||||
} |
||||
} |
||||
|
||||
public class EasyEvent<T> : IEasyEvent |
||||
{ |
||||
private Action<T> mOnEvent = e => { }; |
||||
|
||||
public IUnRegister Register(Action<T> onEvent) |
||||
{ |
||||
mOnEvent += onEvent; |
||||
return new CustomUnRegister(() => { UnRegister(onEvent); }); |
||||
} |
||||
|
||||
public void UnRegister(Action<T> onEvent) |
||||
{ |
||||
mOnEvent -= onEvent; |
||||
} |
||||
|
||||
public void Trigger(T t) |
||||
{ |
||||
mOnEvent?.Invoke(t); |
||||
} |
||||
} |
||||
|
||||
public class EasyEvent<T, K> : IEasyEvent |
||||
{ |
||||
private Action<T, K> mOnEvent = (t, k) => { }; |
||||
|
||||
public IUnRegister Register(Action<T, K> onEvent) |
||||
{ |
||||
mOnEvent += onEvent; |
||||
return new CustomUnRegister(() => { UnRegister(onEvent); }); |
||||
} |
||||
|
||||
public void UnRegister(Action<T, K> onEvent) |
||||
{ |
||||
mOnEvent -= onEvent; |
||||
} |
||||
|
||||
public void Trigger(T t, K k) |
||||
{ |
||||
mOnEvent?.Invoke(t, k); |
||||
} |
||||
} |
||||
|
||||
public class EasyEvent<T, K, S> : IEasyEvent |
||||
{ |
||||
private Action<T, K, S> mOnEvent = (t, k, s) => { }; |
||||
|
||||
public IUnRegister Register(Action<T, K, S> onEvent) |
||||
{ |
||||
mOnEvent += onEvent; |
||||
return new CustomUnRegister(() => { UnRegister(onEvent); }); |
||||
} |
||||
|
||||
public void UnRegister(Action<T, K, S> onEvent) |
||||
{ |
||||
mOnEvent -= onEvent; |
||||
} |
||||
|
||||
public void Trigger(T t, K k, S s) |
||||
{ |
||||
mOnEvent?.Invoke(t, k, s); |
||||
} |
||||
} |
||||
|
||||
public class EasyEvents |
||||
{ |
||||
private static EasyEvents mGlobalEvents = new EasyEvents(); |
||||
|
||||
public static T Get<T>() where T : IEasyEvent |
||||
{ |
||||
return mGlobalEvents.GetEvent<T>(); |
||||
} |
||||
|
||||
|
||||
public static void Register<T>() where T : IEasyEvent, new() |
||||
{ |
||||
mGlobalEvents.AddEvent<T>(); |
||||
} |
||||
|
||||
private Dictionary<Type, IEasyEvent> mTypeEvents = new Dictionary<Type, IEasyEvent>(); |
||||
|
||||
public void AddEvent<T>() where T : IEasyEvent, new() |
||||
{ |
||||
mTypeEvents.Add(typeof(T), new T()); |
||||
} |
||||
|
||||
public T GetEvent<T>() where T : IEasyEvent |
||||
{ |
||||
IEasyEvent e; |
||||
|
||||
if (mTypeEvents.TryGetValue(typeof(T), out e)) |
||||
{ |
||||
return (T)e; |
||||
} |
||||
|
||||
return default; |
||||
} |
||||
|
||||
public T GetOrAddEvent<T>() where T : IEasyEvent, new() |
||||
{ |
||||
var eType = typeof(T); |
||||
if (mTypeEvents.TryGetValue(eType, out var e)) |
||||
{ |
||||
return (T)e; |
||||
} |
||||
|
||||
var t = new T(); |
||||
mTypeEvents.Add(eType, t); |
||||
return t; |
||||
} |
||||
} |
||||
|
||||
#endregion |
||||
|
||||
#if UNITY_EDITOR |
||||
internal class EditorMenus |
||||
{ |
||||
[UnityEditor.MenuItem("QFramework/Install QFrameworkWithToolKits")] |
||||
public static void InstallPackageKit() |
||||
{ |
||||
Application.OpenURL("https://qframework.cn/qf"); |
||||
} |
||||
} |
||||
#endif |
||||
} |
@ -1,11 +0,0 @@
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2 |
||||
guid: 109e532e5f905684597f56d42cd0bbce |
||||
MonoImporter: |
||||
externalObjects: {} |
||||
serializedVersion: 2 |
||||
defaultReferences: [] |
||||
executionOrder: 0 |
||||
icon: {instanceID: 0} |
||||
userData: |
||||
assetBundleName: |
||||
assetBundleVariant: |
Loading…
Reference in new issue