开源分享 Unity3d客户端与C#分布式服务端游戏框架

好久以前,在博客园写了一篇文章,《分布式网游server的一些想法语言和平台的选择》,当时就有了用C#作网游服务端的想法。写了个Unity3d客户端分布式服务端框架,最近发布了1.0版本,取名ET框架。ET框架的目标就是简化客户端开发,简化分布式服务端开发,可是功能很是强大,彻底能够做为一个大型分布式服务端使用。ET框架有不少创造性的设计:javascript

1.可用VS单步调试的分布式服务端,N变1

通常来讲,分布式服务端要启动不少进程,一旦进程多了,单步调试就变得很是困难,致使服务端开发基本上靠打log来查找问题。日常开发游戏逻辑也得开启一大堆进程,不只启动慢,并且查找问题及其不方便,要在一堆堆日志里面查问题,这感受很是糟糕,这么多年也没人解决这个问题。ET框架使用了相似守望先锋的组件设计,全部服务端内容都拆成了一个个组件,启动时根据服务器类型挂载本身所须要的组件。这有点相似电脑,电脑都模块化的拆成了内存,CPU,主板等等零件,搭配不一样的零件就能组装成一台不一样的电脑,例如家用台式机须要内存,CPU,主板,显卡,显示器,硬盘。而公司用的服务器却不须要显示器和显卡,网吧的电脑可能不须要硬盘等。正由于这样的设计,ET框架能够将全部的服务器组件都挂在一个服务器进程上,那么这个服务器进程就有了全部服务器的功能,一个进程就能够做为整组分布式服务器使用。这也相似电脑,台式机有全部的电脑组件,那它也彻底能够看成公司服务器使用,也能够看成网吧电脑。咱们开发的时候就只须要启动一个服务器进程,这个服务器进程就能够用VS启动,那么固然就可使用VS进行单步调试了。java

2.随意可拆分功能的分布式服务端,1变N

分布式服务端要开发多种类型的服务器进程,好比Login server,gate server,battle server,chat server friend server等等一大堆各类server,传统开发方式须要预先知道当前的功能要放在哪一个服务器上,当功能愈来愈多的时候,好比聊天功能以前在一个中心服务器上,以后须要拆出来单独作成一个服务器,这时会牵扯到大量迁移代码的工做,烦不胜烦。ET框架在日常开发的时候根本不太须要关心当前开发的这个功能会放在什么server上,只用一个进程进行开发,功能开发成组件的形式。发布的时候使用一份多进程的配置便可发布成多进程的形式,是否是很方便呢?随便你怎么拆分服务器。只须要修改极少的代码就能够进行拆分。不一样的server挂上不一样的组件就好了嘛!python

3.跨平台的分布式服务端

ET框架使用C#作服务端,如今C#是彻底能够跨平台的,在linux上安装mono,便可,不须要修改任何代码,就能跑起来。性能方面,由于.net已经开源,mono已经被微软收购,如今mono的性能很强,测试了,只比windows慢一点点,比lua,python什么快的多了。作游戏服务端彻底不在话下。日常咱们开发的时候用VS在windows上开发调试,发布的时候发布到linux上便可。ET框架还提供了一键同步工具,打开unity->tools->rsync同步,便可同步代码到linux上,linux

./Run.sh Config/StartConfig/192.168.12.188.txt

便可编译启动服务器。ios

4.提供协程支持

C#天生支持异步变同步语法 async和await,比lua,python的协程强大的多,新版python以及javascript语言甚至照搬了C#的协程语法。分布式服务端大量服务器之间的远程调用,没有异步语法的支持,开发将很是麻烦。因此java没有异步语法,作单服还行,不适合作大型分布式游戏服务端。例如:git

// 发送C2R_Ping而且等待响应消息R2C_Ping
R2C_Ping pong = await session.Call<R2C_Ping>(new C2R_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,全部的服务器间的异步操做将变得很是连贯,不用再拆成多段逻辑。大大简化了分布式服务器开发github

5.提供相似erlang的actor消息机制

erlang语言一大优点就是位置透明的消息机制,用户彻底不用关心对象在哪一个进程,拿到id就能够对对象发送消息。ET框架也提供了actor消息机制,实体对象只须要挂上ActorComponent组件,这个实体对象就成了一个Actor,任何服务器只须要知道这个实体对象的id就能够向其发送消息,彻底不用关心这个实体对象在哪一个server,在哪台物理机器上。其实现原理也很简单,ET框架提供了一个位置服务器,全部挂载ActorComoponet的实体对象都会将本身的id跟位置注册到这个位置服务器,其它服务器向这个实体对象发送消息的时候若是不知道这个实体对象的位置,会先去位置服务器查询,查询到位置再进行发送。mongodb

6.提供服务器不停服动态更新逻辑功能

热更是游戏服务器不可缺乏的功能,ET框架使用的组件设计,能够作成守望先锋的设计,组件只有成员,无方法,将全部方法作成扩展方法放到热更dll中,运行时从新加载dll便可热更全部逻辑。数据库

7.客户端热更新一键切换

由于ios的限制,以前unity热更新通常使用lua,致使unity3d开发人员要写两种代码,麻烦的要死。以后幸亏出了ILRuntime库,利用ILRuntime库,unity3d能够利用C#语言加载热更新dll进行热更新。ILRuntime一个缺陷就是开发时候不支持VS debug,这有点不爽。ET框架使用了一个预编译指令ILRuntime,能够无缝切换。日常开发的时候不使用ILRuntime,而是使用Assembly.Load加载热更新动态库,这样能够方便用VS单步调试。在发布的时候,定义预编译指令ILRuntime就能够无缝切换成使用ILRuntime加载热更新动态库。这样开发起来及其方便,不再用使用狗屎lua了json

8.客户端服务端用同一种语言,而且共享代码

下载ET框架,打开服务端工程,能够看到服务端引用了客户端不少代码,经过引用客户端代码的方式实现了双端共享代码。例如客户端服务端之间的网络消息两边彻底共用一个文件便可,添加一个消息只须要修改一遍。

9.UDP TCP协议无缝切换

ET框架不但支持TCP,并且支持可靠的UDP协议,UDP支持是封装了ENet库,ENet也是英雄联盟所使用的网络库,其特色是快速,而且网络丢包的状况下性能也很是好,这个咱们作过测试TCP在丢包5%的状况下,moba游戏就卡的不行了,可是使用ENet,丢包20%仍然不会感到卡。很是强大。

10 还有不少不少功能,我就不详细介绍了

a.及其方便检查CPU占用和内存泄漏检查,vs自带分析工具,不用再为性能和内存泄漏检查而烦恼
b.使用NLog库,打log及其方便,日常开发时,能够将全部服务器log打到一个文件中,不再用一个个文件搜索log了
c.统一使用Mongodb的bson作序列化,消息和配置文件所有都是bson或者json,而且之后使用mongodb作数据库,不再用作格式转换了。
d.提供一个强大的ai行为树工具
e.提供一个同步工具
f.提供命令行配置工具,配置分布式很是简单

ET框架的服务端是一个强大灵活的分布式服务端架构,彻底能够知足绝大部分大型游戏需求。使用这套框架,客户端开发者就能够本身完成双端开发,节省大量人力物力,节省大量沟通时间。

代码地址:https://github.com/egametang/Egametang
讨论QQ群 : 474643097

使用方法: 1.用git clone代码下来,安装Unity 2017.1p5 和VS2017 2.vs打开Unity/Unity.sln,编译 3.再启动一个vs打开Server/Server.sln,编译 4.打开Unity->tools菜单->命令行配置,选择LocalAllServer.txt 这是启动单一App的方式,若是要启动一组多App服务器,在命令行工具中选择127.0.0.1.txt,点击启动便可,具体配置均可以本身用这个命令行配置工具修改 5.点击工具中的启动,这样就启动了服务端(也能够用VS启动,方便单步调试) 7.运行Unity,输入账号,点击登陆这时日志 链接Gate成功,表示运行OK!