通常来说,分式服务端要启动很多进程,一旦进程多了,单步调试就会变得非常困难,引导服务端开启发起基础上靠打日志来查问题。正常开发游戏总编辑也得打开一大堆进行,不仅启动滚动慢,而且查找问题及其不便,要在一堆日志里面查问题,这种感觉非常糯米糕,那么多年也没有人解决这个问题。ET框架使用了类似守望先锋的组件设计,所有服务端内容都拆成了一个组件,启动时根据服务器类挂载自己所需要的组件。有点像电脑,电脑都模块化的拆成了内存,CPU,主板等零件,配件不同的零件就可以组装成一台不同的电脑,比如家用台式机需要内置,CPU,主板,显示器,显示器,硬盘。而公司用的服务器却不行需要显示器和显卡,网吧的电脑可能不需要硬盘等。正由于这样的设计,ET框架可以将所有的服务组都挂在一个服务器进入过程序上,那么这个服务器进入过程序就有了所有的服务器具的功能,一个进入程序就可以使用作整组分解式服务器使用。也似于电脑,台式机拥有所有的电脑组件,那它也完全可以当做公司服务器使用,也可以当做网吧电脑。
分发式服务端要开发多种类型的服务端,比如登录服务器,入口服务器,对战服务器,聊天服务器好朋友服事务器等一大堆各种服务器,传统开发方式需要先知道当前的功能要放在哪里服务器上,当功能越来越多的时候,比起聊天功能之前在一个中心服务器上,之后需要拿出来单独做一个服务器,这个时候会拉伸到大量迁移代码的工作,烦不烦。ET框架在正常开发的时候根本不是太需要注意当开发前的这个功能会放什么服务器上,只用一个进程进行开发,功能开启组合的形式。发布的时候使用一份多进程的配置即可发布形成为多进程的形式,是不是很好呢?随你拆分服务器。只需要极少数的代码就进行拆分拆分。。。不一样的不一样的挂上挂上挂上
ET框架使用C#做服务端,现在C#是完全可以超越平台的,在linux上安装.netcore,即可,不需要修改任何代码,就能跑起来。面,现在.netcore的性能非常强,比lua,python,js什么快的了。做游戏服务端完全不在话下。平时我们开发的时候用VS在windows上开发调试,发布的时候开发到linux上即可。ET框架还提供了一个按键同步工具,打开unity->tools->rsync同步,即可同步代码到linux上
./Run.sh Config/StartConfig/192.168.12.188.txt
即可以编译启动服务器。
C#天生支持异步语言异步和等待,比lua,python的协程更强的多,新版python以及javascript语言甚至照搬了C#的协程语言法。终端大量服务器之间的远程调用,没有异步语言法的,开发将非常。。。没有没有异常,做单的,做单服务,不还
// 发送C2R_Ping并且等待响应消息R2C_Ping
R2C_Ping pong = await session.Call(new C2R_Ping()) as R2C_Ping;
Log.Debug("收到R2C_Ping");
// 向mongodb查询一个id为1的Player,并且等待返回
Player player = await Game.Scene.GetComponent<DBProxyComponent>().Query<Player>(1);
Log.Debug($"打印player name: {player.Name}")
可以看出,有了async await,所有的服务间的异常操作都会变得非常连贯,不用再拆成多段通讯。大大简化了分发式服务器开发
erlang语言一大优势就是位置透明的消息机制,用户完全不用关心对象在哪个进程,拿到id就可以对象发送消息。ET框也提供了演员消息制作,实体对象只需要挂上MailBoxComponent组件,这个实体对像就成了一个演员,任何服务器只需要知道这个实体对像的id就可以向其发送消息,完全不用担心这个实体对象在哪个服务器,在哪个物理机上。其现实原理也很简单,ET框架提供了一个位置服务,所有挂载MailBoxComponent的实体对象都会自己的id跟随位置设置注册到这个位置服务,其他它服务器向这个实例实体对象发送消息的时候如果不知道这个实体对象的位置,会先去位置服务器查询,查询到位再进行发送。
更热的是游戏服务器不可缺少的功能,ET框架使用的组件设计,可以做守望先锋的设计,组件只有成员,无方,将所有方法做扩展方法放热更dll中,运行时重新加载dll即热更多的收藏。
可以使用csharp.lua或者ILRuntime加载修改即可做客户端更热。再也不使用狗屎lua了,客户端可以实现所有送温暖更新,包提供议定,配置,ui等。
开发不使用重新启动客户端即可修改客户端总编辑代码,开发极其方便
下载ET框架,打开服务端工程,可以看到服务端引用了很多客户端代码,通过引用客户端代码的方式实现了双终端共享代码。例如客户端服务端之间的网络消息两边完整共享一个文件即可,添加一个消息只需要修改一下即可。
ET框架不但是支持TCP,并且支持可靠的UDP协约(ENET跟KCP),ENet是英雄联盟所使用的网络库,其特点是快速,并且网络丢包的情况下性也能非常好,这个我们做的过测试TCP在丢包5%的情况下,moba游戏就卡的不行了,但是使用ENet,丢包20%仍然不会感知到卡。非常强大。框架还支持使用KCP协约,KCP也是可以的靠UDP协议,据称比ENET性能更好,使用kcp请注意,需要自己加心跳机,否则20秒未收到包,服务端将断开连接。协议可以无限切换。
可以用Unity导出场景数据,给服务端做重金属寻路。做MMO非常方便,demo演示了服务端3d寻路功能
这样就可以打印出进程中任何数据,大大简化了服务端查找问题的难点,启动回复方法,直接在控制台中输入回复车辆即可以输入复制模式
几行代码即可创建机器人登录游戏。机器人压力测试轻而易举,机器人跟正常的玩家完全一样,线上前用机器人做好压测,大大降低线上崩率
ET的AI框架让AI编写比UI还简单
跟市面上的测试用例不一样,ET的测试用例都是一个完整的游戏环境,针对协议等级别,不需要搞各种接口去mock。写开始非常快
还有很多功能,请参阅官方github。
master分支持需要unity2021.3版(用到了C#10的语言)
启动Unity, Edit->Preferences->External Tools External ScriptEditor选VS或Rider, Generate .csproj files for全部不需要勾选
Unity菜单 File -> Open Project... -> Open 选择中ET/Unity文件夹,点击选择文件夹按钮。
点击Unity菜单Assets -> Open C# Project 启动vs
打开Unity菜单ET/BuildTool 点击BuildModelAndHotfix,这一步将编辑客户端代码
用Rider打开ET/ET.sln 编译(一定要全部工程编译,右键VS解决方案,全部编译)
Unity中双点击Scenes目录中的Init场景,点击Play即可运行
注意这是ClientServer模式,Unity中运行了一个服务器。如果需要单独运行服务器,可以点击下面步骤:
打开Unity菜单ET/ServerTool,点击StartServer,启动服务器
打开Unity菜单ET/BuildTool CodeMode选择Client,点击BuildModelAndHotfix,这一步将编译客户端代码
Unity中双点击Scenes目录中的Init场景,点击Play即可运行
1.点击HybridCLR->Installer,把两个main改成1.0,点击安装,等安装完成 2.ET->BuildTool->BuildModelAndHotfix,编译好要热更的dll 3.点击HybridCL R->生成->全部 4 .点击打包(注意,这是第一次打包) 5.点击HybridCLR->CopyAotDlls,这一步会把需要补充元数据的dll复制到Assets/Bundles/AotDlls目录录,并设置ab包标签 6.点击打包(注意,这是第二次打包) 7. 如果提示meta不一致,说明没有打包两次
想修改配置就进入Excel目录修改对应的表格,做运行步骤的第6步,然后重新运行Server.App工程来启动服务端。
unity->tools菜单->打包工具,选择PC,勾选是否打包exe,点击开始打包,打出一个PC包在发布目录下。
运行Unity 登录 进入大厅 进入场景
运行PC包 登录 进入大厅
点击鼠标右键即可移动人物
一. 出问题的原因都是: