Unity3d PureMVC框架

来源:互联网 发布:js then的用法 编辑:程序博客网 时间:2024/04/29 17:27
第一次写博客哈,这个是之前 一个工程里面 摘取出来放一块,方便查看学习。整个框架核心代码就这些吧。各类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);
}

}

0 0
原创粉丝点击