# ET-Platform **Repository Path**: fengssy/ET-Platform ## Basic Information - **Project Name**: ET-Platform - **Description**: ET的平台化版本,适用于快速使用,以及方便引入第三方ET组件 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 1 - **Created**: 2019-04-17 - **Last Updated**: 2024-04-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 1. ET-Platform是什么 ## 1.1 先介绍下ET: ET是一个开源的游戏客户端(基于unity3d)服务端双端框架,服务端是使用C# .net core开发的分布式游戏服务端,其特点是开发效率高,性能强,双端共享逻辑代码,客户端服务端热更机制完善,同时支持可靠udp tcp websocket协议,支持服务端3D recast寻路等等 ET源码地址: https://github.com/egametang/ET ## 1.2 ET-Platform ET-Platform是对ET的一个整合(修改了部分源码),使之能够更为方便的引用,让框架部分和使用者的代码部分分离更完全,以及更方便ET插件的开发(服务端可以使用nuget包的方式进行引入) ET-Platform选用ET版本为4.0,master,commitID:e981155(2019-03-13 18:40) # 2. 使用说明(开发基于ET-Platform框架的游戏流程) 需要下载的文件: [unitypackage文件](http://fengssy.gitee.io/et-platform/ET-Platform-Client-Template/ET-Platform-Client-Template-for-ET.Server.Model-1.0.unitypackage) [MessageProto工具包](http://fengssy.gitee.io/et-platform/MessageProto/MessageProto-1.1.0.zip) [Excel配置示例](http://fengssy.gitee.io/et-platform/ExcelConfigs/UnitConfig.xlsx) ## 2.1 客户端初始化部分: Unity 新建项目,导入unitypackage文件 打开Unity的C#项目 (菜单: Assets->Open C# Project) 分别在"Unity.Model项目/Assets/ET/Model/"和"Unity.Hotfix项目/Assets/ET/Hotfix/"下新增一个目录,用于存放开发者自己的代码,该新增的目录下,目录结构规范参考同级目录"ET"下的目录结构 打开"Edit Layers...",设置 "User Layer 8"=Map "User Layer 9"=Hidden File->Build Settings... 将两个ET场景"ET/Scenes/Init"和"ET/Scenes/Map"加入到"Scenes In Build"并打勾 或者理解原理后,自行创建对应的场景 ## 2.2 服务端初始化部分: VS新建三个项目: .netCore控制台,用于服务端的启动,建议命名"***.Start" 热更层的类库(.netCore2.1+),用于匹配客户端热更部分的服务端,建议命名"***.Hotfix" Model层的类库(.netCore2.1+),用于匹配客户端非热更部分的服务端,建议命名"***.Model" 1. 配置三个项目的输出路径都配置在同一个目录下,建议配置"..\\..\\ServerRelease\\" 2. 控制台项目引用Model层类库,热更层类库引用Model层类库 3. 三个项目都引用nuget包:ET.Server.Model 4. 热更层的类库和控制台项目引用nuget包:ET.Server.Hotfix ## 2.3 开始开发 ### 2.3.1 自定义通讯消息(使用proto生成实体类和操作码定义类) 1. 下载MessageProto工具包,解压到根目录/MessageProto里并编辑里面的三个proto文件(**注意需要修改为自己的前缀,默认为"Demo"**): **InnerMessage.proto,服务器之间内部通讯消息定义放这里 **HotfixMessage.proto,热更模块里服务器和客户端之间的通讯消息放这里 **OuterMessage.proto,非热更模块里服务器和客户端之间的通讯消息放这里 2. 编辑好之后需要生成cs文件: **Unity菜单栏:Tools->Proto2CS,根据界面上的说明进行配置和生成 ( 注: 一般是需要修改默认的"Demo"目录名 )** *或者使用手动生成: 打开MessageProto/BuildProtocToCS.cmd 编辑参数后运行* Hotfix和Outer生成的类建议分别放在"Unity目录/Assets/ET/Model/自己项目目录/"和"Unity目录/Assets/ET/Hotfix/自己项目目录/"下 Inner生成的类建议放在服务端Model项目中 服务端Model添加文件链接的方式,引入Hotfix和Outer的文件 ### 2.3.2 服务端Model层和Hotfix层的初始化入口 ```c# [ObjectSystem] public class ModelInit : AwakeSystem { public override void Awake(HotfixComponent self) { } } ``` ### ```c# [ObjectSystem] public class HotfixInit : AwakeSystem { public override void Awake(HotfixComponent self) { } } ``` ### 2.3.3 Start项目的入口代码 ```c# class Program { private static string UserHotfixDllFilePath = "./LiveH5Games.Server.Hotfix.dll"; private static string UserHotfixPdbFilePath = "./LiveH5Games.Server.Hotfix.pdb"; private static void Main(string[] args) { //控制台调用例子 try { //初始化服务管理器 ServerManager.Init(UserHotfixDllFilePath, UserHotfixPdbFilePath); //加载配置 Options options = Game.Scene.AddComponent(args).Options; StartConfig startConfig = Game.Scene.AddComponent(options.Config, options.AppId).StartConfig; if (!options.AppType.Is(startConfig.AppType)) { Log.Error("命令行参数apptype与配置不一致"); return; } switch (startConfig.AppType) { case AppType.AllServer: // allserver一般为调试,需要控制台输出等交互 Game.Scene.AddComponent(); break; } //初始化服务管理器 AutoResetEvent loopEndEvent = new AutoResetEvent(false); //开始当前配置的服务消息循环 ServerManager.StartServerLoopByConfig(typeof(ModelInit).Assembly, startConfig, loopEndEvent); } catch (Exception e) { Log.Error(e); } } } ``` ### 2.3.4 客户端可加入自己的model层和热更层初始化操作 事件:EventIdType.ModelInit和EventIdType.HotfixInit 代码如: ```c# /// /// "HotfixInit"为(固定的)热更层初始化事件名 /// [Event(EventIdType.HotfixInit)] public class HotfixInit : AEvent { ``` ### 2.3.5 生成配置 1. 编辑数据源 ET是采用xlsx文件作为配置的数据源,分别生成配置类和配置json数据文件 "/ConfigBuild/Source/"目录下放配置文件,将使用文件名作为类名,如"2.使用说明"里下载的Excel配置示例 2. 生成配置文件和类文件 然后打开Unity的菜单栏: "Tools"->"从Excel生成配置" 3. 服务端使用 服务端的配置,如果和客户端一致,那么推荐使用文件链接的形式引用客户端的文件,同时服务端是使用动态程序集加载的热更层,所以只需要选用Hotfix层 如果服务端配置有和客户端不一致的(如部分字段只能存放于服务端),那么需要单独使用生成的服务端文件 4. 客户端使用 客户端生成的配置和类文件会自动放好(配置文件在/Assets/ET/Res/Config/下) 在Unity的Project面板,打开"Assets/ET/Bundles/Independent/Config.prefab" 将生成的配置文件引用到"ReferenceCollector"组件里,这样打包时才可以自动将配置文件一起打包进去 ### 2.3.6 定义自己的单位类 继承Unit,可以把位置旋转等信息字段都放在自己的单位类中 ### 2.3.7 客户端热更层Session的使用 ```c# // 先创建Model层的session以及组件 // (Model层使用Model层的session来收发消息) ETModel.Session gateSession = ETModel.Game.Scene.GetComponent().Create("***:**"); ETModel.Game.Scene.AddComponent().Session = gateSession; // 再用Model层的session创建ETHotfix层的Session,以及组件 // (热更层使用热更层的session来收发消息) Game.Scene.AddComponent().Session = ComponentFactory.Create(gateSession); //区分开来的目的是为了避开IRuntime的继承 ``` ## 2.4 示例: 本库源码即包含了一个服务端寻路demo ## 2.5 注意 1. 登录到进入地图需要调用框架的两个方法,并按照约定通讯必要信息 2. 打包独立资源的部分,记得需要配置ReferenceCollector组件面板! # 3. 部署说明 [参考ET]([https://github.com/egametang/ET/blob/master/Book/1.1%E8%BF%90%E8%A1%8C%E6%8C%87%E5%8D%97.md](https://github.com/egametang/ET/blob/master/Book/1.1运行指南.md)) [资源Web服务下载](http://fengssy.gitee.io/et-platform/FileServer/FileServer-1.0.0.zip) 启动配置可以参考例子里的"Start项目/StartConfig/" # 4. 开发插件 插件类库里,提供一个初始化方法给外部调用,代码如: ```c# private static bool Inited = false; /// /// 初始化本插件,要在本库中任何一个组件之前调用(不能在事件里调用,推荐在程序入口处调用) /// public static void Init() { if (!Inited) { ETModel.Game.EventSystem.Add(typeof(BulletHelper).Assembly); Inited = true; } } ``` # 注意 本框架ILRuntime还未对接完成