ET的消息派发流程

关键代码在OuterMessageDispatcher这个类里

    public class OuterMessageDispatcher: IMessageDispatcher
    {
        public void Dispatch(Session session, ushort opcode, object message)
        {
            DispatchAsync(session, opcode, message).Coroutine();
        }
        
        public async ETVoid DispatchAsync(Session session, ushort opcode, object message)
        {
            // 根据消息接口判断是不是Actor消息,不同的接口做不同的处理
            switch (message)
            {
                case IActorLocationRequest actorLocationRequest: // gate session收到actor rpc消息,先向actor 发送rpc请求,再将请求结果返回客户端
                {
                    long unitId = session.GetComponent().Player.UnitId;
                    ActorLocationSender actorLocationSender = Game.Scene.GetComponent().Get(unitId);

                    int rpcId = actorLocationRequest.RpcId; // 这里要保存客户端的rpcId
                    long instanceId = session.InstanceId;
                    IResponse response = await actorLocationSender.Call(actorLocationRequest);
                    response.RpcId = rpcId;

                    // session可能已经断开了,所以这里需要判断
                    if (session.InstanceId == instanceId)
                    {
                        session.Reply(response);
                    }
                    
                    break;
                }
                case IActorLocationMessage actorLocationMessage:
                {
                    long unitId = session.GetComponent().Player.UnitId;
                    ActorLocationSender actorLocationSender = Game.Scene.GetComponent().Get(unitId);
                    actorLocationSender.Send(actorLocationMessage);
                    break;
                }
                case IActorRequest actorRequest:  // 分发IActorRequest消息,目前没有用到,需要的自己添加
                {
                    break;
                }
                case IActorMessage actorMessage:  // 分发IActorMessage消息,目前没有用到,需要的自己添加
                {
                    break;
                }
                default:
                {
                    // 非Actor消息
                    Game.Scene.GetComponent().Handle(session, new MessageInfo(opcode, message));
                    break;
                }
            }
        }
    }

这个类处理的是服务端收到客户端的消息时对消息的处理流程,我们知道服务端和客户端是通过Session来通讯的,所以服务端首先是Gate Session会收到消息数据,然后来到这里,这里再根据消息类型走不同的处理流程。

如果是IActorLocationRequest类型消息,它会从SessionPlayerComponent拿到UnitId,通过UnitId取得ActorLocationSender,再用ActorLocationSender发送消息数据给Unit

你可能感兴趣的:(ET的消息派发流程)