
一、Actor模型
Actor之间通过消息来传递实现。
每个Actor都配有一个邮箱,我们称之为MailBox,MailBox将润滑缓存其他 Actor发来消息,
Actor从邮箱中按先进先出的顺序处理消息
Actor模型可以帮助消除同享状态,因为Actor之间具有隔离性,内部可以安全处理不需要考虑多线程中的锁机制。
可能会阻塞自己的逻辑,但是不会阻塞自己的线程,所以多个Actor可以同时进行消息的传递及处理。
二、Actor消息发送
Acotr模型中有个非常重要的概念,即是Actor地址。
因为当一个Actor需要和另一个Actor通讯时,必须通过这个地址。
ET框架考虑到式的网络环境,通过Entity的InstanceId对Actor进行了抽象并屏蔽了不同进行间的差异。
三、ActorLocation
虽然在Actor模型中只需要知道对方的InstanceId地址就能发送,但是当Actor在不同进程中转移时InstanceId地址将发发生变化。
为此ET框架提供了ActorLocaltion机制,这个机制增加了Location定位服务,Entity通过自身的ID和InstanceID,使得消息可以发送到目标Entity进行处理。
四、举例说明:
我们打开OuterMessage.proto,如下图定义C2M_TestActorLocationResponse从客户端到Map服务器.指定类型为// IActorLocationRequest,并指定返回类型.
定义M2C_TestActorLocationResponse 从Map服务回到Client客户端消息.指定类型为IActorLocationResponse
再定义无返回消息类型,C2M_TestActorLocationResponse从客户端到Map服务器,指定类型为IActorLocationMessage,注意与普通消息不同这里需要固定字段RpcId
再定义M2C_TestActorMessage 定义类型 //IActorMessage 此类型不需要经过网关服务器,因此不需要使用RpcId
在消息格式编写完后,需要点击ET > Proto 文件夹下的win_startProtoExport.bat文件
客户端消息处理
我们在客户端编写代码,打开Client > Unity.Hotfix > Demo > Scene 打开SceneChangeHelper.cs 在SceneChangeTo方法下方添加代码
和之前普通消息一样的方式发送
在Client > Unity.Hotfix > Demo > Login 下创建此类 用于接收M2C_TestActorMessage类型的消息
服务器端消息处理:
我们打开Server > Server.Hotfix > Login中添加下面两个脚本,用于处理客户端发送的C2M_TestActorLocationRequest以及C2M_TestActorLocationMessage类型的消息
需要注意的是这里拿到的是客户端的Unit.以及记得为消息打上标签
至此我们可以编译全部代码
五、查看结果
在完成上面步骤后我们编译所有代码,然后运行服务器
然后运行回到Unity编辑器中,按F5编译资源,运行项目点击登录 > Enter 进入到游戏中
至此我们可以看到客户端的所以打印