Unity ET 框架 分布式網(wǎng)絡(luò)消息通信 詳
DEMO配表



ActorMessageSenderComponent.Instance.Send 會(huì)將消息體或流完整的發(fā)到 對(duì)應(yīng) 進(jìn)程
再通過(guò)NetInnerComponent處理
ActorMessageSenderComponent.Instance.Call 會(huì)將消息體或流完整的發(fā)到 對(duì)應(yīng) 進(jìn)程 再通過(guò)NetInnerComponent處理
DEMO 流程
當(dāng)客戶端發(fā)送登錄請(qǐng)求 ? 到Realm

隨機(jī)拿到Gate對(duì)應(yīng)的SceneConfig后 用其InstanceId(包含了Gate內(nèi)網(wǎng)的進(jìn)程號(hào))對(duì)Gate 進(jìn)程 的內(nèi)網(wǎng)進(jìn)行通訊
ActorMessageSenderComponent.Instance.Call

拿到目標(biāo)內(nèi)網(wǎng)進(jìn)程 從Realm內(nèi)網(wǎng)建立 拿到對(duì)應(yīng)編號(hào)的Channel 與 Gate內(nèi)網(wǎng) 沒(méi)有就連接 并發(fā)送消息
ProcessActorId processActorId = new ProcessActorId(actorId);
processActorId.Process 對(duì)應(yīng) 了 目標(biāo)(Gate)
processActorId.ActorId 對(duì)應(yīng) 將 當(dāng)前進(jìn)程注入 修改 為了回執(zhí)
實(shí) ActorId 是 Gate 的 SceneConfig InstanceId
虛 ActorId 是 為了Gate的內(nèi)網(wǎng)收到消息后 知道 消息是由哪個(gè)內(nèi)網(wǎng)進(jìn)程發(fā)出
當(dāng)Gate服務(wù)端內(nèi)網(wǎng)收到消息時(shí) 通過(guò) SessionStreamDispatcherServerInner 分發(fā) 處理 R2G_GetLoginKey
G2R_GetLoginKey 是內(nèi)網(wǎng)消息體

虛 ActorId 是 為了 拿到 回執(zhí) 的 對(duì)應(yīng)內(nèi)網(wǎng)(Realm)將 InnerMessageDispatcherHelper.HandleIActorRequest 處理完 拿到 對(duì)應(yīng) IActorResponse 再拿到來(lái)源或與來(lái)源(Realm)建立連接 發(fā)回
內(nèi)網(wǎng)消息 分發(fā) 的 實(shí) ActorId 為 沒(méi)什么用 這里 對(duì)應(yīng) Gate 的 SceneConfig 的 InstanceId
Realm服務(wù)器 內(nèi)網(wǎng)拿到 后 通過(guò) SessionStreamDispatcherServerInner 分發(fā) 處理 G2R_GetLoginKey

將對(duì)應(yīng)的tcs(類似TaskCompetedTask)SetResult();

await 完成 得到 Key 返回給客戶端
當(dāng) 客戶端 發(fā)送 進(jìn)入 地圖 的 消息 外網(wǎng)消息解析 常規(guī)


MessageHelper.SendToClient 最終調(diào)用
ActorMessageSenderComponent.Instance.Send(actorId, message);
actorId 為 客戶端 連接的 Gate 的 Session 的 InstanceId
當(dāng)Gate服務(wù)端內(nèi)網(wǎng)收到消息時(shí) 通過(guò) SessionStreamDispatcherServerInner 處理 自行處理 拿到 Session 發(fā)送
根據(jù) 發(fā)來(lái)的ActorId 拿到原來(lái) 的 Session 發(fā)送 (這里看上去雞肋 但轉(zhuǎn)移Map時(shí)有用 這也是為什么不在C2G_EnterMapHandler直接拿到Session 返回的原因)

M2M_UnitTransferRequest 將 Unit 轉(zhuǎn)移到對(duì)應(yīng)地圖Map
await LocationProxyComponent.Instance.Lock
調(diào)用 ActorMessageSenderComponent.Instance.Call 發(fā)送 ObjectLockRequest 給 Location 內(nèi)網(wǎng) 收到后調(diào)用


鎖住unit的Id 在time秒后解鎖 解鎖后 會(huì) 記入定位字典
協(xié)程中 若時(shí)間到之前 已經(jīng) 被 UnLock lockInfo被Dispose InstanceId置為0 返回退出
調(diào)用 ActorMessageSenderComponent.Instance.Call 發(fā)送 M2M_UnitTransferRequest 給 對(duì)應(yīng) Map 內(nèi)網(wǎng) 收到后調(diào)用

后 回執(zhí) 給 Gate 后 Gate 處理

將對(duì)應(yīng)的tcs(類似TaskCompetedTask)SetResult();

await 完成 解鎖 Dispose Unit

解鎖時(shí)注入的response.NewInstanceId 是 Unit 所在 Map 的 進(jìn)程號(hào) 因此可以 通過(guò) 此NewInstanceId知道Unit重設(shè)后所在內(nèi)網(wǎng)進(jìn)程
而最新unit.Id對(duì)應(yīng)的InstanceId可以通過(guò) LocationProxyComponent.Instance.Get 獲得
ActorLocationSenderComponent消息通訊會(huì)自動(dòng)獲得
當(dāng)客戶端切換地圖時(shí)
發(fā)送消息體 C2M_TransferMap 是 IActorLocationMessage 內(nèi)網(wǎng)消息體 Gate外網(wǎng)接收


詢問(wèn)Location服務(wù)器 要 Unit 當(dāng)前的 InstanceId 以獲得對(duì)應(yīng) 內(nèi)網(wǎng)進(jìn)程

再發(fā)送給 對(duì)應(yīng) 的 Map 內(nèi)網(wǎng)服務(wù)(NetInnerComponent) 去接收 C2M_TransferMap 的流
再 用 Map 內(nèi)網(wǎng)服務(wù) SessionStreamDispatcherServerInner 去處理 內(nèi)網(wǎng)方式

Map 處理 下

轉(zhuǎn)移到另一個(gè)內(nèi)網(wǎng)Map服務(wù)

會(huì)拿到客戶端與Gate連接的Session 的 InstanceId 通過(guò)ActorMessageSenderComponent.Instance.Send方式將 消息體發(fā)送給Gate內(nèi)網(wǎng) 再由 Gate內(nèi)網(wǎng) SessionStreamDispatcherServerInner 解析 M2C_StartSceneChange 外網(wǎng)消息體

回執(zhí)給Gate結(jié)果
當(dāng)客戶端右鍵行走
發(fā)送 C2M_PathfindingResult 在 連接的Gate 外網(wǎng) SessionStreamDispatcherServerOuter 分發(fā)
將消息發(fā)送給 unit 所在 服務(wù)對(duì)應(yīng)內(nèi)網(wǎng)進(jìn)程 (Map)
然后 Map 內(nèi)網(wǎng) 收到后 SessionStreamDispatcherServerInner 分發(fā)
檢測(cè)為內(nèi)網(wǎng)處理的消息 IActorLocationMessage 繼承 IActorRequest

再回執(zhí)給 Gate 完成