Unity之ET框架

First Post:

Last Update:

Word Count:
1.6k

Read Time:
6 min

Unity之ET框架

介绍

ET是一个开源的游戏客户端(基于unity3d)服务端双端框架,服务端是使用C# .net core开发的分布式游戏服务端,其特点是开发效率高,性能强,双端共享逻辑代码,客户端服务端热更机制完善,同时支持可靠udp tcp websocket协议,支持服务端3D recast寻路等等

功能

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

一般来说,分布式服务端要启动很多进程,一旦进程多了,单步调试就变得非常困难,导致服务端开发基本上靠打log来查找问题。平常开发游戏逻辑也得开启一大堆进程,不仅启动慢,而且查找问题及其不方便,要在一堆堆日志里面查问题,这感觉非常糟糕,这么多年也没人解决这个问题。ET框架使用了类似守望先锋的组件设计,所有服务端内容都拆成了一个个组件,启动时根据服务器类型挂载自己所需要的组件。这有点类似电脑,电脑都模块化的拆成了内存,CPU,主板等等零件,搭配不同的零件就能组装成一台不同的电脑,例如家用台式机需要内存,CPU,主板,显卡,显示器,硬盘。而公司用的服务器却不需要显示器和显卡,网吧的电脑可能不需要硬盘等。正因为这样的设计,ET框架可以将所有的服务器组件都挂在一个服务器进程上,那么这个服务器进程就有了所有服务器的功能,一个进程就可以作为整组分布式服务器使用。这也类似电脑,台式机有所有的电脑组件,那它也完全可以当作公司服务器使用,也可以当作网吧电脑。

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

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

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

ET框架使用C#做服务端,现在C#是完全可以跨平台的,在linux上安装.netcore,即可,不需要修改任何代码,就能跑起来。性能方面,现在.netcore的性能非常强,比lua,python,js什么快的多了。做游戏服务端完全不在话下。平常我们开发的时候用VS在windows上开发调试,发布的时候发布到linux上即可。ET框架还提供了一键同步工具,打开unity->tools->rsync同步,即可同步代码到linux上

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

案例

ET开发的商业mmo项目千古风流成功上线

发布

服务端

修改服务端配置文件

Excel\StartConfig\Release目录下修改

StartMachineConfig@s.xlsx 修改内外网ip为自己的外网ip,建议都改成”0.0.0.0”,全网卡监听。

StartZoneConfig@s.xlsx:为MongoDB 的配置文件,搭建了MongoDB也可以更改一下

运行环境搭建

以linux ubuntu20.04为例,其他版本可参考微软文档,先安装运行库

使用 APT 进行安装可通过几个命令来完成。 安装 .NET 之前,请运行以下命令,将 Microsoft 包签名密钥添加到受信任密钥列表,并添加包存储库。

打开终端并运行以下命令:

1
2
3
wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb

安装运行时

通过 ASP.NET Core 运行时,可以运行使用 .NET 开发且未提供运行时的应用。 以下命令将安装 ASP.NET Core 运行时,这是与 .NET 最兼容的运行时。 在终端中,运行以下命令:

1
2
sudo apt-get update && \
sudo apt-get install -y aspnetcore-runtime-6.0

重要

如果收到类似于“找不到包 aspnetcore-runtime-6.0”的错误消息,请参阅 APT 疑难解答部分。

作为 ASP.NET Core 运行时的一种替代方法,你可以安装不包含 ASP.NET Core 支持的 .NET 运行时:将上一命令中的 aspnetcore-runtime-6.0 替换为 dotnet-runtime-6.0

1
sudo apt-get install -y dotnet-runtime-6.0

运行包上传

编译的目录实在工程的Bin目录下,将其拷贝到服务端即可,我的服务端路径为:/srv/pwnsky/ble/server并且在服务端将其创建,采

用rsync来进行拷贝。

1
2
3
4
# 拷贝二进制文件
rsync -avz --delete ./Bin/ root@ble.pwnsky.com:/srv/pwnsky/ble/server/Bin/
# 拷贝配置文件
rsync -avz --delete ./Config/ root@ble.pwnsky.com:/srv/pwnsky/ble/server/Config/

启动服务器

1
cd /srv/pwnsky/ble/server/Bin && dotnet Server.dll --Process=1 --StartConfig=StartConfig/Release --Console=1

查看是否启动

1
netstat -antup | grep dotnet

本地测试命令

1
dotnet Server.dll --Process=1 --StartConfig=StartConfig/Localhost --Console=1

在启动时,会出现

1
> 2022-09-16 17:11:14.7523 System.DllNotFoundException: Unable to load shared library 'RecastDll' or one of its dependencies. In order to help diagnose loading problems, consider setting the LD_DEBUG environment variable: libRecastDll: cannot open shared object file: No such file or directory.

设定

1
LD_DEBUG=net6.0/RecastDll.dll && cd /srv/pwnsky/ble/server/Bin && dotnet Server.dll --Process=1 --StartConfig=StartConfig/Release --Console=1
打赏点小钱
支付宝 | Alipay
微信 | WeChat