组件与外部通信分为平台通信和组件交互通信。通过平台通行,组件可以将Log等消息发送给平台显示在调试窗口,用户在平台的操作也能实时反馈到组件上;通过组件之间的交互通信,组件可以调用其他组件的相关功能。要实现组件与外部的通信需要从发送消息和接收消息两部分说起。

发送消息

在Main类和其他继承DMonobehiviour的类里可以通过sender来发送消息。

函数模式说明
Send所有模式消息发送基本函数,所有参数都可设置
EditorOperation编辑模式主机客户端,组件之间转发事件
EditorSystem编辑模式系统消息
Log所有模式输出Log消息
LogError所有模式输出Error消息
LogWarning所有模式输出Warning消息
RunKeyCode运行模式从机发给主机客户端,同步按键操作
RunOperation运行模式主机客户端里,组件之间转发事件
RunOperationToSub运行模式转发事件,主机客户端只发给指定客户端的指定组件
RunStatus运行模式主机客户端发给其他从机,同步自身状态
RunSystem运行模式系统消息
SendToSelf运行模式发送消息给自身
SendToSystem运行模式发送消息给系统
SendToTarget运行模式发送消息给目标物体

一个简单的角色输入控制脚本如下:

using UnityEngine;

namespace TestComp1
{
    public class TestInput1 : DMonoBehaviour
    {
        private void Update()
        {
            if (Input.GetKey(KeyCode.W))
                sender.RunKeyCode(0, "W");
            if (Input.GetKey(KeyCode.S))
                sender.RunKeyCode(0, "S");
            if (Input.GetKey(KeyCode.A))
                sender.RunKeyCode(0, "A");
            if (Input.GetKey(KeyCode.D))
                sender.RunKeyCode(0, "D");
            //按F键操作其他组件
            if (Input.GetKey(KeyCode.F))
                sender.RunKeyCode(1, null);   
        }
    }
}

使用sender.Send()自定义构造发送参数时,消息基本类型枚举SendType:

消息类型说明
SubToMain从机发送消息给主机
MainToAll主机发送消息给所有客户端
MainToMain主机发送消息给自身
MainToSubs主机发送消息给所有从机
MainToSomeOne主机发送消息给某个客户端
MainSystem主机系统消息

系统消息类型枚举MainSystemType,枚举命名规则:Mes结尾为发送给主机和所有从机,Event结尾为发送给主机,Status结尾为发送给所有从机。

消息类型说明
EndMes结束消息
EnvironmentMes环境消息,全局消息
UIMes在UI面板输出的消息
SetParentMes设置父物体
SetChildMes设置子物体
InfoMesDebug Info消息
WarningMesDebug Warning消息
ErrorMesDebug Error消息
StatusChangeEvent组件逻辑状态改变消息
AIFlowEvent组件流程状态改变消息
SetParentStatus同步设置父物体状态
SetChildStatus同步设置子物体状态

接收消息

组件如果需要接收消息,则该组件主入口Main必须实现IMesRec接口(运行模式)或IEditorRec接口( 编辑模式),相关函数说明如下

函数说明
RecMessage主机或从机发来的消息
ReceiveEditorOperationMes接收来自操作或数据的事件消息
public class Main : ScriptManager, IMesRec, IEditorRec
{
    public void RecMessage(SendType type, GameObject senderObj, int eventType, string param)
    {
        throw new System.NotImplementedException();
    }
    
    public void ReceiveEditorOperationMes(GameObject senderObj, int eventType, string param)
    {
        throw new System.NotImplementedException();
    }
}

主从同步

从机客户端将按键操作发送给主机逻辑,主机逻辑处理后驱动主机客户端运行,然后将改变后的状态实时同步到其他从机客户端。

1539246164289.png

组件交互

从机客户端将按键操作发送给主机逻辑,主机逻辑处理后将结果转发到其他组件并驱动主机客户端运行,各组件的状态改变实时同步到其他从机客户端。

1539246215000.png