本人使用的是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次才行)
-----以上就是服务器热更知识。
来源:oschina
链接:https://my.oschina.net/u/4454895/blog/3175321