首先这个消息分发系统是一个继承于Mono单例模式的,所以他也是一个单例内容,使用起来很简单,只需要知道以下几点即可。

        第一,单例记得添加;

        第二,添加消息监听;

        第三,分发消息;

        一共就这三个内容,第一点没有什么好说的,单例模式,添加在场景当中就好了,关于单例模式的内容,可以参考【项目框架——单例模式】进行详细的了解。主要是接下来的第二和第三点。

        添加消息监听之前,我们来看看消息监听函数类。

        ImessageEventListener,这个就是我们消息监听类的虚基类,里面标识了类是否还存在意义,类是否允许管理类进行清理,处理消息和在同级消息当中的优先级。

        ImessageBase,看见base基本就明白了,这个是框架里面预制了一种消息监听类,新增了回调函数,拥有对象以及是否可以清理三个内容。

        知道了上面这两个内容,对于添加消息监听的理解就简单多了,无非就是两种类型,一种是使用框架内置的消息监听类进行监听,这个时候我们需要的参数仅仅是一个回调而已,当然,其他的参数也是需要的,另外一种就是使用新的消息监听类进行添加监听。

        最后就是分发消息。

        分发消息其实没有什么内容,主要是调用分发消息的接口即可。值得提一下的是Unity内置分发和其他线程分发。

        内置的分发没有什么问题,他运行于unity Update当中,没有同步的问题,都是直接分发出去的。

        其他线程分发就不同了,他使用了线程锁,而且参数也变了,当我们使用线程分发时,参数不再是变长的,而是固定参数长度为一,但是监听方法上依然写的是变长的,这个没有变,只不过针对于方法的处理上有所不同,线程分发的变长是在第一个参数上进行的变长参数,也就是object里面封装了一个变长的object[]。

        举例:

CS.Game.Engine.LuaManager.Instance:SendMessageToThread("SET_DIREN_PARENT",diren,zidan,ziji, "3",b1,b2,b3,"-850","1500","1",fenzhi);

        这个方法是在lua文件里面发送的,他的实际调用方法就是调用了线程分发机制,他最终的处理方法是在一个UI上,代码如下:

/// <summary>
/// 设置敌人
/// </summary>
/// <param name="arms"></param>
private void SetDiRenParent(params object[] vs)
{
    List<System.Object> arms = vs[0] as List<System.Object>;
 
    GameObject go = arms[0] as GameObject;
    m_DiRen = go.transform;
 
    GameObject g = arms[1] as GameObject;
    m_ZiDan = g.transform;
 
    m_Self = arms[2] as GameObject;
    int cout = int.Parse(arms[3] as string);
    m_Bgs = new RectTransform[cout];
    int index = 4;
    for (int i = 0; i < cout; i++)
    {
        m_Bgs[i] = (arms[index++] as GameObject).GetComponent<RectTransform>();
    }
 
    m_Limit = float.Parse(arms[index++] as string);
    m_MaxLimit = float.Parse(arms[index++] as string);
    m_TempY = float.Parse(arms[index++] as string);
    GameObject fen = arms[index] as GameObject;
    m_ShowFenZhi = fen.GetComponent<Text>();
}

        有的小伙伴可能看到了,其实lua里面调用的并不是消息单例,没有关系,主要是框架当中不想导出太多接口类到lua当中,所以在lua管理单例类当中写了个消息分发的接口而已。

 

项目GitHub地址

https://github.com/FengFaming/ClientEngine