先写一下思路,暂时的理解,仅作自身理解的记录。如有误还望读者能指正
1、创建控制器类,包括注册,移除,处理消息等方法。
2、创建不同类型的类,根据类的类型,向控制器中的对应的表注册对应的枚举字段(即消息)。
3、发送消息。在控制器中处理消息,根据不同类类型,调用不同类型类的消息处理方法,枚举比对消息,执行对应的事件。
根据LuaFramework框架的消息处理理解,写了个小demo。可扩展View层,添加Game层消息,等等。
(1) 控制器的消息处理。主要以字典,加集合的方式,key对应注册或调用对象,value对应当前对象的消息集合。
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
public class Controller_Send {
Dictionary<View_Send, List<MessageEnum>> viewMap;
readonly static object mylock = new object();
public Controller_Send()
{
viewMap = new Dictionary<View_Send, List<MessageEnum>>();
}
private static Controller_Send instance;
public static Controller_Send Instance
{
get
{
if (instance == null)
{
lock (mylock)
{
instance = new Controller_Send();
}
}
return instance;
}
}
public void RegisterViewCommand(View_Send view,List<MessageEnum> messageID)
{
lock (mylock)
{
if (viewMap.ContainsKey(view))
{
List<MessageEnum> tempList = null;
if (viewMap.TryGetValue(view, out tempList))
{
for (int i = 0; i < tempList.Count; i++)
{
if (tempList.Contains(messageID[i]))
{
continue;
}
tempList.Add(messageID[i]); // tempList ??? 没毛病,List类型类似于指针
}
}
}
else
{
viewMap.Add(view, messageID);
}
}
}
public void ExecuteCommand( View_Send view ,MessageEnum msg)
{
List<View_Send> views = new List<View_Send>();
if (viewMap.ContainsKey(view)) // 说明是view层消息
{
//得 到 view层的所有对象 ,在下面处理消息
foreach (var item in viewMap.Keys)
{
views.Add(item);
}
}
else
{
//其他层
}
if (views !=null && views.Count >0 ) //处理所有监听view层的事件
{
for (int i = 0; i < views.Count; i++)
{
views[i].DoUIEvent(msg);
}
}
}
}
(2)简单的view层,用来注册消息,监听消息
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class View_Send : MonoBehaviour {
List<MessageEnum> list
{
get
{
return new List<MessageEnum>()
{
MessageEnum.Start,
MessageEnum.Start1,
MessageEnum.Start2,
MessageEnum.Start3,
};
}
}
void Start () {
Controller_Send.Instance.RegisterViewCommand(this, list);
}
public void DoUIEvent(MessageEnum msg)
{
switch (msg)
{
case MessageEnum.Start:
Debug.LogError("Start");
break;
case MessageEnum.Start1:
Debug.LogError("Start1");
break;
case MessageEnum.Start2:
Debug.LogError("Start2");
break;
case MessageEnum.Start3:
Debug.LogError("Start3");
break;
default:
break;
}
}
void Update () {
if (Input.GetKeyDown(KeyCode.A))
{
Controller_Send.Instance.ExecuteCommand(this,MessageEnum.Start);
}
if (Input.GetKeyDown(KeyCode.B))
{
Controller_Send.Instance.ExecuteCommand(this, MessageEnum.Start1);
}
if (Input.GetKeyDown(KeyCode.C))
{
Controller_Send.Instance.ExecuteCommand(this, MessageEnum.Start2);
}
if (Input.GetKeyDown(KeyCode.D))
{
Controller_Send.Instance.ExecuteCommand(this, MessageEnum.Start3);
}
}
}
(3)枚举消息
using UnityEngine;
using System.Collections;
public enum MessageEnum {
Start = 0,
Start1 = 1,
Start2 = 2,
Start3 = 3,
}