关于消息的监听,发送,处理

先写一下思路,暂时的理解,仅作自身理解的记录。如有误还望读者能指正

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,
}
 

发布了26 篇原创文章 · 获赞 8 · 访问量 5797

猜你喜欢

转载自blog.csdn.net/LM514104/article/details/89398350