DESKTOP-B25GA9E\W35
2 years ago
7 changed files with 43 additions and 983 deletions
@ -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 @@ |
|||||||
fileFormatVersion: 2 |
|
||||||
guid: 109e532e5f905684597f56d42cd0bbce |
|
||||||
MonoImporter: |
|
||||||
externalObjects: {} |
|
||||||
serializedVersion: 2 |
|
||||||
defaultReferences: [] |
|
||||||
executionOrder: 0 |
|
||||||
icon: {instanceID: 0} |
|
||||||
userData: |
|
||||||
assetBundleName: |
|
||||||
assetBundleVariant: |
|
Loading…
Reference in new issue