了解ET
ET是一个开源的游戏客户端(基于unity3d)服务端双端框架,服务端是使用C# .net core开发的分布式游戏服务端.
- [ETBook] 为什么使用C# .net core做服务端?
- ET框架使用C#做服务端,现在C#是完全可以跨平台的,在linux上安装.netcore,即可,不需要修改任何代码,就能跑起来。性能方面,现在.netcore的性能非常强,比lua,python,js什么快的多了。做游戏服务端完全不在话下。
- 为什么选择ILRuntime热更?
- 这世界上没有ios上不能用的热更方案,因为除了ios以外根本不需要任何热更方案就能直接热更
- 因为ios的限制,之前unity热更新一般使用lua,导致unity3d开发人员要写两种代码,麻烦的要死。之后幸好出了ILRuntime库,利用ILRuntime库,unity3d可以利用C#语言加载热更新dll进行热更新。ILRuntime一个缺陷就是开发时候不支持VS debug,这有点不爽。ET框架使用了一个预编译指令ILRuntime,可以无缝切换。平常开发的时候不使用ILRuntime,而是使用Assembly.Load加载热更新动态库,这样可以方便用VS单步调试。在发布的时候,定义预编译指令ILRuntime就可以无缝切换成使用ILRuntime加载热更新动态库。这样开发起来及其方便,再也不用使用狗屎lua了
- [ETBook] 为什么后端选MongoBson序列化库?
- [ETBook] 为什么选MongoDB数据库?
- [ETBook] 什么是组件式设计?
- ET在设计的时候吸收了这些想法,但是并不完全照搬,目前的设计是我经过长期的思考跟重构得来的,还是有些自己特色。
- [猫大语录] 为什么在ET4.0之后不附带帧同步Demo?
- [猫大语录] 为什么在ET4.0之后服务器命令行没有log?
版本区别
简单的说说ET6.0 beta(master)的设计。
目前还没到正式使用的程度, 先学习思路
- 之前每个功能是一个进程,比如realm gate location map,现在改成每个功能是一个Scene,一个Scene可以放到一个进程中。这样一台物理机先启动固定的进程,然后各个scene放到进程中运行。非常类似docker。
- 所有的Scene放在一个进程就变成了AllServer模式
- 服务器内部全部使用actor发送消息,比如realm发给gate,其实是发个actor消息到gate scene
- dbserver将取消,每个进程直连mongodb,使用异步调用存取数据
- 协程锁简化了很多实现,例如location队列,actor队列,mailbox消息队列,全部使用协程锁实现,代码非常精简。
- Scene可以开服前配置好在哪个进程(比如realm gate)也可以动态创建(比如副本,分线场景)。动态创建Scene回收Scene非常简单。
运行Demo前的准备事项
IDE选择
- VS
- ET 6.0 beta (master)
- 只能用VS2019 (.net core 3.0)
- ET 5.0
- 建议使用VS2019 ( 用2017就自己去官网下 .net core 2.2)
- ET 4.0分支使用vs2017(更新到最新版),并且要勾选
- a. .net 桌面开发
- visual studio tools for unity
- .net core 2.1
- ET 6.0 beta (master)
- Rider
- 安装 对应的 .net core
- other…..
- VS
Unity版本选择
建议使用对应版本, 其他版本自行测试
- ET6.0beta (master)
- [x] unity 2018.4.10f1
- [x] unity 2018.4.11f1
- ET5.0
- [x] unity2018.4
- ET4.0
- [x] unity2017.4
- 为什么是.4版本
- 别问怎么破解.问就是个人免费版.
- 如果只是为了黑色皮肤, 请参考 UnityDarkSkin
- 安装MongoDB数据库(Demo中注释了数据库组件)
准备运行Demo
请先按照运行指南走一遍, 该编译的编译,该启动的启动
- 常见的错误解决方法
- 2L: 运行环境net CDK不匹配问题
- 3L: 运行环境问题
- 4L: Unity DLL引用错误问题
- 5L: 打包EXE运行黑屏问题
- 6L: ILRuntime一些问题
- 7L: 服务端部署在云服务器问题
- 8L: 打包IL2CPP问题
- 9L: Android9 HTTP问题无法使用UnityWebRequest的问题
- 10L: Reference Collector脚本无法修改key值
- 11L: Win32Exception找不到指定文件,WIN10文件权限
- 12L: KCP.android.ARM64问题
- ET6.0问题收集
- 启动服务器命令行参数错误
- 6.0 beta版 release后运行会出现bug
测试状态同步Demo
打包一个客户端,unity开一个客户端.就会出现2个小人.点击鼠标右键即可移动人物.看到效果.
帧同步Demo
在4.0分支.
学习ET
你可能需要如下知识储备:
- C# 语言基础
- 设计模式
- 数据结构
- 反射
- 特性
- 异步/协程
- 了解ECS
- 了解actor模型
- 网络层TCP/UDP/KCP/ENET
- MongoDB数据库
- MongoBson
- Protobuf
- 服务器分布式相关
- 网络同步模型的认识
客户端
- Unity基础
- UGUI
- AssetBundle流程
- 热更ILRuntime
其余
- AstarPathfinding
- recastnavigation
- Behavior Designer
- FGUI
- NLog
猫大语录:
应该先去提高下c#基础跟编程基础,再来看ET,碰到问题自己想办法解决,谷歌,打log。你现在好比初中基础却来做大学题目一样,到处碰壁,碰到问题自己不研究指望别人给你找问题,这样编程技术是无法提高的.
群里能力有高有低,问问题也没什么。但是我是希望群里提问题前能够经过自己一番摸索,经过自己思考,经过谷歌,经过调试log等等再问。很多问题经过自己摸索查找资料能够增长很多知识。其实程序开发就是在不断找bug,在找bug中提升自己。
ET框架设计大纲
- 公共部分
- ET的特色
- 什么是ECS
- async await 协程
- 什么是异步? 单线程?多线程?
- 为什么需要async await,await是多线程吗?
- 更好的Task:ETTask
- 一切皆组件(Entity&Component)
- 事件机制EventSystem
- 强大的mongo bson
- 设计一个双端网络库
- 协议格式的设计
- protobuf
- 使用Kcp协议
- 应用层循环缓冲区
- 消息打包解包
- 消息的分发处理
- 远程过程调用RPC
- 客户端无GC处理
- 服务端
- 服务端架构简介
- 组件式的服务器
- Actor模型
- ActorLocation
- 设计一个计时器( TimerCompoent组件 )
- 服务端热更
- Config
- 数值组件
- Repl
- 客户端
- 客户端架构简介
- 客户端资源管理
- UI框架
- 客户端热更 (ILRuntime)
- 抛弃unity的协程,使用await
- 组件可视化
- Demo
- demo的架构, 消息路径
- recast 3d寻路
ET的一些教学视频
6.0
5.0及以前版本
群内大佬的Github
- C# 实现的十字链表的AOI算法 by 初见
- 在初见的AOI(2D)的基础改成3D AOI by yhr28
- ET-RPG-DEMO(基于ET框架的RPG游戏DEMO) by AE
- RVO2 by AE
- Box2DSharp(BOX2D物理引擎C#版) by 白纸无字Zonciu
- Bullet版本(.netCore封装) by 风恒
- FGUI/双端行为树 by DukeChiang
- NKGNMobaBasedOnET(基于ET框架的Moba游戏DEMO) by 烟雨迷离半世殇
- ET斗地主Demo
- 斗地主架构图 o05k
- ET-MultiplyDemos小游戏集合 by 咲夜詩
- 五星麻将 by 間 間 單 單
- 苏伟涛大佬的github库 (B站主页)
群内大佬分享的一些工具/组件
- [Debug组件]DebuggerComponent.cs mcyz
- [Console插件]DebugCodeLocation.cs
- log双击利用Console插件能够方便的跳到Hotfix代码中
- [AspNet组件]AspNetCoreComponent z84o
- [Http请求帮助类]HttpRequestHelper 7mvr
- ET心跳组件2.0 8p0b
- 这篇是初见早期写的心跳文章 不会心跳的可以看下原理
- 增加工具封装模板github by 苏伟涛
- [AutoGenerateCodeEditor]
- Unity中创建新脚本自动生成ET模板代码
- 演示视频
- ETConfig制作流程简化
- 演示视频
- 使用Scp同步ET热更资源到服务器
- 演示视频
ET学习笔记/博客/公众号
- ET在Mac上运行指南-L主讲百度云视频链接失效,参考文章吧
- ET Mac环境运行和iOS打包指南.pdf 9bzj
- Tinkingli博客教程
- ECS概要–ET游戏框架详解 by 122304518
- 烟雨迷离半世殇的博客
- 咲夜詩的博客
- 群内分享的一些ET笔记 ho3e
- ET5.0学习思维导图 by 小豆子
- ET网络消息流程(Send) & ET网络消息流程(Connect&Recive) & (DateFlow) by 小豆子
- Atheos的笔记
- ET部署到docker by 随风
相关技术的教学文章
MongoDB
- 官方Driver教程
- 官方API文档
- 菜鸟教程
- Working with MongoDB in .NET (Part 1): Driver Basics & Inserting Documents
- Working with MongoDB in .NET (Part 2): Retrieving Documents with Filter Clause
- Working with MongoDB in .NET (Part 3): Skip, Sort, Limit, & Projections
ILRuntime
- 官方主页
- Github-Demo
- QQ群:512079820
- ILRuntime技术相关的总结 vz3q
- 群内讨论/ILRuntime剪裁相关问题
FGUI
- 官方主页
- 官方教程
- QQ群:614444599
- ET+FGUI+BD by DukeChiang
- 烟雨迷离半世殇的博客
论坛答疑
- ETModel vs ETHotfix
- 请教一个MongoDB数据库反序列化相关问题
- 反序列化结构体时出现异常
- 请教逻辑处理Handler如何优雅高效的与UIComponemt交互
- 求助,一份代码ETModel和ETHotfix都有。
- ET的Gate该如何用正确的姿势理解和使用呢
- TimerComponent相关
- 关于ILRunime类反射调用静态分析的问题
- 关于单例类的讨论!
- 求助ActorId与Entity.Id、InstanceId有什么联系
- 求助游戏同步问题!
- 腾讯行为树Behaviac的组件整合到ET的踩坑记录
- 使用IL工具报错
- Unity ILR模式下的await问题
- 求助ScriptOptions和ScriptState的作用
- 关于使用MongoDB对于数据的设计方案
- 关于客户端Session被断开原因码的获得
- 关于数据库任务队列