第一次写博客哈,这个是之前 一个工程里面 摘取出来放一块,方便查看学习。整个框架核心代码就这些吧。各类 Manager , 就自己去加。
- using UnityEngine;
- using System.Collections;
- using System;
- using System.Collections.Generic;
- using System.Text;
- using UnityEngine.Networking.Match;
- using LuaFramework; //IMsage (消息) 观察者模式 //Facade (桥梁模式) 设计模式归纳public class Test : MonoBehaviour{[HideInInspector] [SerializeField] private Rect pRect;//隐藏数据在面板, 并序列化public Rect m_rect {get { return pRect; }set { pRect = value; }} [HideInInspector] [SerializeField] private Texture pTexture;public Texture m_texture {get { return pTexture; }set { pTexture = value; }}void Start(){// 启动框架APPFacade_m.Instance.StartUp();}}/// <summary>/// 消息接口 My/// </summary>public interface IMessage_m{string Name { get; }object Body { get; set; }string Type { get; set; }}public class Message_m : IMessage_m{ public Message_m(string name):this(name,null,null){ }public Message_m(string name, object body):this(name,body,null){ }public Message_m(string name,object body, string type){this.m_Name = name;this.m_Body = body;this.m_Type = type;}public virtual object Body {get { return m_Body; }set { m_Body = value; }}public virtual string Name{get { return m_Name; }}public virtual string Type{get { return m_Type; }set { m_Type = value; }}public override string ToString(){StringBuilder msg =new StringBuilder();msg.Append("Notifiction Name:" + Name + "\nBody :" + ((Body == null) ? "null" : Body.ToString()) + "\nType:" +((Type == null) ? "null" : Type.ToString()));return msg.ToString();}string m_Name;string m_Type;object m_Body;}public interface ICommand_m{void Excute(IMessage_m message);}public interface IController_m{//注册消息void RegisterCommand(string messageName, Type commandType);//执行void ExecuteCommand(IMessage_m messgae);//删除消息void RemoveCommand(string messageName);bool HasCommand(string messageName);}public class ControllerCommand_m : ICommand_m{public virtual void Excute(IMessage_m message){ }}public class ManagerName_m{public const string Network = "NetworkManager";public const string Resource = "ResourceManager";public const string Thread = "ThreadManager";}public class StartUpCommand_m : ControllerCommand_m{public override void Excute(IMessage_m message){/// ----------------初始化各类管理器————APPFacade_m.Instance.AddManager<NetworkManager>(ManagerName_m.Network);APPFacade_m.Instance.AddManager<ResourceManager>(ManagerName_m.Resource);APPFacade_m.Instance.AddManager<ThreadManager>(ManagerName_m.Thread);}}public class APPFacade_m : Facade_m{private static APPFacade_m _instance;public static APPFacade_m Instance{get{if (_instance==null){_instance=new APPFacade_m();}return _instance;}}public override void InitFarmeWork(){base.InitFarmeWork();RegisterCommand(NotiConst_m.START_UP, typeof(StartUpCommand_m));}/// <summary>/// 启动框架/// </summary>public void StartUp(){SendMessageCommand(NotiConst_m.START_UP);RemoveMultiCommand(NotiConst_m.START_UP);}}public class NotiConst_m{/// <summary>/// Controller层消息通知/// </summary>public const string START_UP = "StartUp"; //启动框架public const string DISPATCH_MESSAGE = "DispatchMessage"; //派发信息}public class Controller_m : IController_m{protected IDictionary<string, Type> commandMap;protected IDictionary<IView, List<string>> m_viewCmdMap;protected readonly object syncObj = new object();protected static readonly object m_staticSyncRoot = new object();protected static volatile IController_m m_instance;//TODO volatile 保证在多线程中 每次读取的值都是最新的public static IController_m Instance {get{lock (m_staticSyncRoot){if (m_instance==null){m_instance=new Controller_m();}}return m_instance;} }static Controller_m(){}protected Controller_m(){InitializeController();}protected virtual void InitializeController(){commandMap=new Dictionary<string, Type>();m_viewCmdMap=new Dictionary<IView, List<string>>();}public virtual void ExecuteCommand(IMessage_m messgae){Type commandType = null;List<IView> views = null;lock (syncObj){if (commandMap.ContainsKey(messgae.Name)){commandType = commandMap[messgae.Name];}else{views = new List<IView>();foreach (var de in m_viewCmdMap){if (de.Value.Contains(messgae.Name)){views.Add(de.Key);}}//IView ==null ? "" :null;}if (commandType!=null){object commandInsente = Activator.CreateInstance(commandType);if (commandInsente is ICommand_m){((ICommand_m)commandInsente).Excute(messgae);//执行}} }}public virtual bool HasCommand(string messageName){lock (syncObj)return commandMap.ContainsKey(messageName);}public virtual void RegisterCommand(string messageName, Type commandType){lock (syncObj){//if (!commandMap.ContainsKey(messageName))//{// commandMap.Add(messageName, commandType);//} //TODO commandMap[messageName] = commandType;} }public virtual void RemoveCommand(string messageName){lock (syncObj){if (commandMap.ContainsKey(messageName)){commandMap.Remove(messageName);}}}}public class Facade_m{protected IController_m m_controller;//控制器Dictionary<string,object>m_Managers=new Dictionary<string, object>();//管理器private static GameObject m_gameManager;GameObject AddGameManager{get{if (m_gameManager==null){m_gameManager=GameObject.Find("GameManager");}return m_gameManager;}}protected Facade_m(){InitFarmeWork();}public virtual void InitFarmeWork(){if (m_controller != null) return;m_controller = Controller_m.Instance;}public virtual void RegisterCommand(string commandName,Type commandType){m_controller.RegisterCommand(commandName,commandType);}public virtual void RemoveCommand(string commandName){m_controller.RemoveCommand(commandName);}public virtual void HasCommand(string commandName){m_controller.HasCommand(commandName);}public void RegisterMultiCommand(Type commandType, params string[] commandNames)//TODO params 多个参数{int count = commandNames.Length;for (int i = 0; i < count; i++){RegisterCommand(commandNames[i], commandType);}}public void SendMassageCommand(string message,object body=null){m_controller.ExecuteCommand(new Message_m(message,body));}public void SendMessageCommand(string messageName, object body = null){m_controller.ExecuteCommand(new Message_m(messageName, body));}public void RemoveMultiCommand(params string[] commandName){int count = commandName.Length;for (int i = 0; i < count; i++){RemoveCommand(commandName[i]);}}/// <summary>/// 添加管理器/// </summary>/// <param name="managerName"></param>/// <param name="obj"></param>public void AddManager(string managerName,object obj){if (!m_Managers.ContainsKey(managerName)){m_Managers.Add(managerName,obj);}}/// <summary>/// 添加Unity 对象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="typeName"></param>/// <returns></returns>public T AddManager<T>(string typeName) where T : Component{object result = null;m_Managers.TryGetValue(typeName, out result);if (result != null) return (T) result;Component c= AddGameManager.AddComponent<T>();m_Managers.Add(typeName,c);return default(T);}//获取系统管理器public T GetManager<T>(string typeName) where T : class{if (!m_Managers.ContainsKey(typeName)){return default(T);}object manager = null;m_Managers.TryGetValue(typeName, out manager);return (T) manager;}/// <summary>/// 删除管理器/// </summary>/// <typeparam name="T"></typeparam>/// <param name="typeName"></param>void RemoveManager<T>(string typeName) where T : Component{if (!m_Managers.ContainsKey(typeName))return;object manager = null;m_Managers.TryGetValue(typeName, out manager);Type type = manager.GetType();if (type.IsSubclassOf(typeof(MonoBehaviour))){GameObject.Destroy((Component)manager);} m_Managers.Remove(typeName);} }
就爱阅读 www.92to.com 网友整理上传, 为您提供最全的知识大全, 期待您的分享,转载请注明出处。
来源: