ET5.0服务器热更功能Demo实现

梦想的初衷 提交于 2020-02-26 15:50:03

本人使用的是VS2019和Unity2019.3.0f6版本.net3.1,导入ET5.0项目后,我们来实现如何服务器代码热更.

申明:因为ET5.0原版本使用热更无法正常使用,所以修改了部分源码,至于以后ET作者是否会修复完整,导致现在修改的项目是否冲突暂不可知.

打开服务器工程

方案一(改动大)

1.在入口类Program的Main函数中为Game.Scene添加MailBoxComponent组件 

Game.Scene.AddComponent<MailBoxComponent>();

2.找到C2M_ReloadHandler类,改为

[MessageHandler]
    public class C2M_ReloadHandler : AMRpcHandler<C2M_Reload, M2C_Reload>
    {
        protected override async ETTask Run(Session session, C2M_Reload request, M2C_Reload response, Action reply)
        {

             if (!(request.Account == "XXX" && request.Password == "XXX"))
            {
                Log.Error($"error reload account and password: {MongoHelper.ToJson(request)}");
                return;
            }
            System.Collections.Generic.List<StartConfig> allConfig = Game.Scene.GetComponent<StartConfigComponent>().AllConfig.List;
            NetInnerComponent netInnerComponent = Game.Scene.GetComponent<NetInnerComponent>();
            foreach (StartConfig startConfig in allConfig)
            {
                InnerConfig innerConfig = startConfig.GetComponent<InnerConfig>();
                Session serverSession = netInnerComponent.Get(innerConfig.Address);
                //await serverSession.Call(new M2A_Reload());
                await ActorMessageSenderComponent.Instance.Call(startConfig.SceneInstanceId, new M2A_Reload());

                //Game.EventSystem.Add(DLLType.Hotfix, DllHelper.GetHotfixAssembly());
                Log.Info("热更成功");
            }
            reply();
        }
    }

3.找到M2A_ReloadHandler类,修改为

//[MessageHandler]

[ActorMessageHandler]
    public class M2A_ReloadHandler : AMActorRpcHandler<Scene, M2A_Reload, A2M_Reload>
    {
        protected override async ETTask Run(Scene scene, M2A_Reload request, A2M_Reload response, Action reply)
        {
            Game.EventSystem.Add(DLLType.Hotfix, DllHelper.GetHotfixAssembly());
            reply();
            await ETTask.CompletedTask;
        }
    }

4.找到InnerMessageDispatcherHelper类的HandleIActorRequest方法,只需将replyId 后移

            //long replyId = IdGenerater.GetProcessId(iActorRequest.ActorId);

            iActorRequest.ActorId = iActorRequest.ActorId & IdGenerater.HeadMask | IdGenerater.Head;
            long replyId = IdGenerater.GetProcessId(iActorRequest.ActorId);

至此,就能实现服务器热更.

方案二(改动小): 将热更实现的具体代码放入请求处理函数中

1. 找到C2M_ReloadHandler 类,修改如下

[MessageHandler]
    public class C2M_ReloadHandler : AMRpcHandler<C2M_Reload, M2C_Reload>
    {
        protected override async ETTask Run(Session session, C2M_Reload request, M2C_Reload response, Action reply)
        {

//Unity中需要输入的账号密码
            if (!(request.Account == "XXX" && request.Password == "XXX"))
            {
                Log.Error($"error reload account and password: {MongoHelper.ToJson(request)}");
                return;
            }

            System.Collections.Generic.List<StartConfig> allConfig = Game.Scene.GetComponent<StartConfigComponent>().AllConfig.List;
            NetInnerComponent netInnerComponent = Game.Scene.GetComponent<NetInnerComponent>();
            foreach (StartConfig startConfig in allConfig)
            {
                InnerConfig innerConfig = startConfig.GetComponent<InnerConfig>();
                Session serverSession = netInnerComponent.Get(innerConfig.Address);
                //await serverSession.Call(new M2A_Reload());
                Game.EventSystem.Add(DLLType.Hotfix, DllHelper.GetHotfixAssembly());

                Log.Info("热更成功");
            }
            reply();
        }
    }

 

测试:

1.先编译整个Server工程

2.Unity开启Init场景,打开Tools->命令行配置->启动服务器

3.开启服务器管理:工具Tools->服务器管理工具,写对信息如何点击Reload即可.

4.测试如果返回这个消息说明热更没问题。看到Unity输出返回的消息,服务器控制台输出“热更成功”的信息。

5. 那么我们修改代码(注意只修改Hotfix模块的代码),无需关闭服务器和客户端,只是将服务器输出的Log语句改为 “修改后的热更”,然后生成Hotfix的编译后文件

6.再次执行步棸3两次,发现服务器控制台输出改变为(其实执行一次也能热更,只不过打印是上一次的信息,所以错觉看起来执行2次才行)

-----以上就是服务器热更知识。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!