组件与外部通信分为平台通信和组件交互通信。通过平台通行,组件可以将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 | 设置子物体 |
InfoMes | Debug Info消息 |
WarningMes | Debug Warning消息 |
ErrorMes | Debug 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(); } }
主从同步
从机客户端将按键操作发送给主机逻辑,主机逻辑处理后驱动主机客户端运行,然后将改变后的状态实时同步到其他从机客户端。
组件交互
从机客户端将按键操作发送给主机逻辑,主机逻辑处理后将结果转发到其他组件并驱动主机客户端运行,各组件的状态改变实时同步到其他从机客户端。