1. 项目概述:为什么你需要关注ET框架与这套视频教程?
如果你正在Unity游戏开发领域深耕,尤其是对大型多人在线游戏(MMO)或需要客户端-服务器架构的项目感兴趣,那么“ET框架”这个名字你大概率不会陌生。它是一个在GitHub上拥有近万星标、由国内开发者社区主导维护的、基于C#和Unity的客户端-服务器一体化开源框架。我最初接触ET,是因为厌倦了传统游戏服务器开发中那种“客户端一套逻辑、服务端另一套逻辑、中间再加个协议层”的割裂感,调试起来像在玩“猜猜我在哪”的游戏。ET提出的“双端C#共享逻辑”和“All in One”的开发体验,在当时看来简直是解决痛点的“银弹”。
然而,框架的强大往往伴随着陡峭的学习曲线。ET的架构设计理念,比如其独特的Entity-Component-System(ECS)变体、基于Actor模型的分布式通信、以及为AI原生开发设计的“纤程”(Fiber)概念,对于习惯了传统MonoBehaviour开发模式的Unity开发者来说,需要一次不小的思维转换。官方文档虽然详尽,但更多是API参考和设计理念阐述,对于如何从零开始搭建一个可运行的项目,如何理解其核心工作流,很多新手会感到无从下手。这正是《Unity ET开源框架视频教程》这套资源的价值所在——它试图将官方文档中抽象的概念,转化为可视化的、可跟随操作的实践路径。
这套教程资源,根据网络信息,主要关联着ET框架的多个版本(如ET6、ET7、ET8乃至最新的ET10),并由社区内的资深开发者(如“熊猫”)录制。它不像那些只教你写个“Hello World”的入门课,而是直指核心:如何基于ET架构一个真实的网络游戏项目。从项目配置、网络通信、数据同步,到热更新、AI行为树、服务端部署,它覆盖了一个商业化网络游戏后端所需的关键技术栈。对于独立开发者或中小团队而言,掌握ET意味着你可以用更少的成本(尤其是人力沟通成本)和更高的效率,去挑战那些原本需要庞大后端团队才能支撑的项目类型。
2. ET框架核心架构与设计哲学深度解析
要高效利用这套视频教程,不能只满足于“跟着敲代码”,必须首先理解ET框架底层的设计哲学。这就像学武功,招式(代码)易学,心法(架构思想)难通。ET的架构演进,始终围绕着几个核心目标:开发效率、运行时性能、以及应对“AI原生”时代的开发模式变革。
2.1 双端逻辑共享:告别“翻译”工作
这是ET最吸引人的特性之一。在传统游戏开发中,客户端(Unity C#/Lua)和服务端(Java/C++/Go等)使用不同语言,相同的游戏逻辑(如伤害计算、移动验证、技能释放条件)需要写两遍,极易出现不同步的BUG。ET通过让服务端也运行在.NET环境中,并巧妙利用程序集引用,实现了客户端和服务端核心逻辑代码的复用。
它是如何做到的?ET将游戏逻辑代码放在一个独立的程序集(例如Model、Hotfix)中。客户端Unity项目引用这个程序集,服务端项目(一个.NET控制台应用)也引用同一个程序集。网络消息定义、组件数据、核心业务逻辑都在这里编写一份。运行时,通过预编译指令(如#if SERVER)或依赖注入的方式来区分客户端特有的表现逻辑(如播放动画、粒子特效)和服务端特有的逻辑(如数据库操作、广播消息)。教程里会详细演示如何搭建这样的项目结构,这是你上手ET的第一道关卡。
实操心得:刚开始搭建双端共享项目时,最容易混淆的是“哪些代码该放共享层,哪些该放客户端或服务端专属层”。我的经验是,凡是涉及游戏规则验证、数值计算、状态判定的纯逻辑,都应尽力放在共享层。而像
UnityEngine.GameObject的创建、UI显示、资源加载等与引擎强相关的操作,则必须放在客户端层。视频教程通常会通过一个简单的“移动同步”或“聊天”Demo来让你体会这种代码组织方式。
2.2 Entity-Component-System (ECS) 与 “纤程”(Fiber) Actor模型
ET的ECS并非Unity官方的DOTS ECS,而是一种更贴近传统GameObject-Component模式,但进行了深度定制以服务于网络同步和高效管理的架构。
- Entity: 所有游戏对象的基类,可以理解为带有一个唯一ID的“空壳”。玩家、怪物、技能、甚至一个计时器,都可以是一个Entity。
- Component: 挂在Entity上的数据组件,只有数据,没有方法。例如
MoveComponent可能包含Speed,TargetPosition等字段。这种“纯数据”的设计是热更新的关键。 - System: 处理Component数据的逻辑系统。所有业务逻辑都写在System的静态方法中。例如
MoveSystem的Update方法会遍历所有带有MoveComponent的Entity,根据其速度更新位置。
ET7之后引入的“纤程”(Fiber)概念,是其架构的一次重大升级。你可以把Fiber理解为一个轻量级的、逻辑上的“线程”或“进程”(类似于Erlang中的Process)。每个Fiber拥有自己独立的Entity树和消息队列。关键优势在于:
- 逻辑隔离:不同的游戏系统(如网络、AI、战斗)可以运行在不同的Fiber中,彼此通过消息通信,避免了复杂的锁竞争。
- 利用多核:框架调度器可以将不同的Fiber分配到不同的物理线程上执行,天然支持多核CPU。
- 简化并发:在单个Fiber内部,代码仍然是顺序执行的(单线程体验),开发者无需处理线程安全问题。跨Fiber通信则通过Actor消息机制,这是一种成熟且安全的并发模型。
视频教程中关于“多线程架构设计”的部分,会深入讲解Fiber的创建、调度以及Actor消息的发送与处理,这是理解ET高性能服务端如何工作的核心。
2.3 网络层:KCP、TCP与无缝切换
网络是网络游戏的命脉。ET内置了对KCP这个可靠UDP协议的支持。与TCP的“公平性”不同,KCP通过更激进的重传策略,在有一定丢包的网络环境下(如移动网络),能提供更低的延迟和更少的卡顿,非常适合实时竞技游戏。
更强大的是其协议无缝切换能力。ET的网络抽象层允许你在不修改业务代码的情况下,在KCP、TCP、WebSocket之间切换。框架底层会处理连接建立、心跳、重连等细节。当检测到UDP不通(例如某些企业防火墙限制)时,可以自动降级到TCP,保证玩家不掉线。教程中关于网络模块的章节,会教你如何配置和启用这些协议。
2.4 热重载与热更新:开发效率的倍增器
热重载:在游戏运行(无论是客户端还是服务端)时,修改C#逻辑代码,保存后无需重启游戏,新逻辑立即生效。这极大地缩短了调试循环,尤其是服务端逻辑调试,传统方式需要停止服务、编译、重启、重新登录,过程长达几分钟,而ET的热重载可以在秒级内完成。
热更新:客户端使用HybridCLR(原huatuo)方案,实现完整的C#代码热更新。这意味着你可以在游戏发布后,修复BUG或增加新功能,玩家无需重新下载安装包。服务端同样支持基于组件的热更新。
视频教程会手把手教你如何配置HybridCLR,如何组织热更程序集,以及如何触发热重载。这是ET开发流程中“爽点”最高的部分之一。
3. 基于视频教程的实战入门:搭建你的第一个ET项目
看十遍不如做一遍。我们假设你已经拿到了《Unity ET开源框架视频教程》的资源,下面我将结合教程的常见脉络,梳理出一个清晰的实战入门路径,并补充一些教程可能未提及的细节和坑点。
3.1 环境准备与项目初始化
- 安装Unity Hub与Unity编辑器:根据ET框架版本要求(例如ET8对应Unity 2021 LTS,ET10可能要求2022+),安装指定版本的Unity。务必通过Hub安装,并勾选对应的“.NET桌面开发”和“Linux构建支持”模块,因为服务端可能需要发布到Linux。
- 安装Visual Studio 2022或Rider:作为C# IDE,VS2022需要安装“.NET Core跨平台开发”工作负载。Rider对Unity和.NET开发支持极佳,是很多ET开发者的首选。
- 克隆ET仓库:从GitHub克隆官方仓库(
egametang/ET)。注意分支,master分支通常是最新版本(如ET10),而Unity分支可能是较旧的稳定版(如ET8)。视频教程会指明基于哪个版本,务必对应。 - 用Unity打开项目:打开克隆下来的
ET文件夹(里面包含Assets,ProjectSettings等)。首次打开会导入资源并编译,时间较长。
3.2 理解项目结构与运行第一个Demo
打开项目后,你会看到类似如下的关键目录:
Assets/:Unity客户端资源。Model/,Hotfix/,ModelView/,HotfixView/:这是ET经典的四程序集结构。Model和Hotfix是共享的逻辑层代码(服务端和客户端逻辑),ModelView和HotfixView是客户端独有的表现层代码。ET7/8之后结构有所变化,但核心的“逻辑-表现”分离思想不变。Packages/:ET框架本身的Package包,采用Unity的Package Manager管理,这是ET9/10的重要改进,模块化程度更高。Book/:官方文档。Tools/:各种工具,如代码生成器、配置表导出工具。
教程的第一步通常是教你如何运行内置的Demo。以经典的“移动同步”Demo为例:
- 在Unity编辑器中,找到
Assets/Scenes下的Init场景并打开。 - 确保
ServerTools面板(Unity菜单栏ET -> Server Tools)配置正确,比如选择LocalAll模式(在一台机器上启动所有服务器进程)。 - 点击
ServerTools面板的Start按钮启动服务端。你会在控制台看到多个服务器进程(如Realm, Gate, Map等)的日志输出。 - 点击Unity的播放按钮运行客户端。
- 在Game视图中,你应该能看到角色,并通过键盘(如WASD)控制角色移动,同时观察服务端日志或客户端网络信息,验证移动指令是否成功发送并广播。
注意事项:第一次运行时,最常见的失败原因是端口冲突。确保你的机器上没有其他程序占用了教程中指定的端口(如20000, 20001)。如果启动失败,仔细查看控制台的红字错误日志。另一个常见问题是编译错误,可能是因为IDE的.NET SDK版本与项目不匹配,或者某些依赖包未正确恢复。尝试在Unity中点击
Assets -> Open C# Project重新生成解决方案,并在IDE中执行“还原NuGet包”操作。
3.3 核心工作流:从配置表到功能实现
教程会引导你体验一个完整的ET功能开发闭环:
配置表(Excel/Luban):游戏数值策划在Excel中配置。ET早期使用自研的Excel导出工具,现在主流推荐使用Luban(一个强大的游戏配置解决方案)。教程会教你如何配置Luban,将Excel导出为二进制或JSON格式,并在代码中加载使用。
// 示例:加载配置表 UnitConfig config = UnitConfigCategory.Instance.Get(1001); Debug.Log($"单位{config.Name}的生命值为{config.Hp}");网络消息定义:使用Protobuf或MemoryPack定义客户端与服务端、服务端内部进程间通信的消息结构。ET后期版本转向性能更高的MemoryPack。
// MemoryPack 消息定义示例 [MemoryPackable] public partial class C2M_TestMessage : MessageObject, IRequest { public string Info { get; set; } } [MemoryPackable] public partial class M2C_TestMessage : MessageObject, IResponse { public string Reply { get; set; } }编写System逻辑:在
Hotfix程序集中,为你的Component编写对应的System。这是业务逻辑的核心。// 示例:处理移动的System public static class MoveSystem { public static void Update(this Unit unit) { MoveComponent moveComponent = unit.GetComponent<MoveComponent>(); if (moveComponent == null || moveComponent.Targets.Count == 0) { return; } // 计算移动逻辑... unit.Position = Vector3.MoveTowards(unit.Position, moveComponent.Targets[0], moveComponent.Speed * TimeInfo.DeltaTime); // 位置更新后,可能需要广播给其他玩家 MessageHelper.Broadcast(unit, new M2C_PathfindingResult() { Id = unit.Id, X = unit.Position.x, ... }); } }热重载测试:修改上述
MoveSystem的代码,保存。在Unity编辑器不停止播放的情况下,按下Ctrl+R(或教程指定的热重载快捷键),观察控制台输出“Reload完成”,然后再次操作角色,新的移动逻辑立即生效。
4. 教程资源详解与高效学习路径
《Unity ET开源框架视频教程》通常不是单一课程,而是一个系列合集。根据网络信息,它可能包含:
- ET6/ET7基础入门系列:由“字母哥”、“烟雨迷离半世殇”等社区大佬录制,覆盖框架搭建、基础组件、网络通信、数据库操作等。这是打基础的必看部分。
- 熊猫的进阶课程:
- 《网络游戏架构设计》:基于ET7.2,27集。这是精髓,深入讲解ET的分布式设计、Actor模型、软路由、服务发现等高级主题,适合想深入理解框架设计理念和构建大型项目的开发者。
- 《帧同步设计》:基于ET8,12集。专门讲解如何用ET实现预测回滚帧同步,这是制作竞技类游戏(如MOBA、FPS)的核心技术。
- 《多线程架构设计》:基于ET8,11集。深入剖析Fiber、多线程调度、Actor消息处理,对于优化服务器性能至关重要。
- WebGL/小游戏适配教程:讲解如何将ET客户端项目发布到WebGL平台,并连接ET服务端,涉及网络协议(WebSocket)适配和性能优化。
- 社区分享与Demo解析:如“斗地主Demo”、“背包系统”、“球球大作战”等完整小项目的源码解读,是学习框架综合运用的最佳材料。
高效学习建议:
- 先通观,后深钻:不要一开始就陷入某一集的技术细节。先快速浏览整个教程目录,对ET的全貌有个了解。然后从最基础的“Hello World”Demo开始,确保能跑通。
- 边看边练,代码必敲:视频教程最大的忌讳是“只看不练”。一定要跟着视频一步步操作,遇到报错不要慌,这是学习的一部分。尝试修改Demo中的参数,观察变化,加深理解。
- 善用官方资源:视频教程是“拐杖”,最终要学会查阅官方文档(
Book/目录)、GitHub Wiki和源码。遇到问题,先在ET的官方QQ群(如688514974)或GitHub Issues中搜索,很多问题已有解答。 - 聚焦核心,避免分心:ET生态周边插件很多(如YIUI UI框架、FGUI适配、行为树编辑器等)。初期应集中精力攻克框架核心(ECS、网络、热更),等核心流程走通后,再根据项目需要引入UI等插件。
5. 常见问题与避坑指南实录
在实际学习和使用ET框架的过程中,你会遇到无数个坑。以下是我和社区开发者们总结的一些高频问题及解决方案:
| 问题现象 | 可能原因 | 排查与解决思路 |
|---|---|---|
| 服务端启动失败,提示“端口已被占用” | 1. 之前运行的服务端进程未完全退出。 2. 有其他软件(如Skype、IIS)占用了相同端口。 | 1. 在ServerTools面板点击Stop,或直接去任务管理器中结束所有dotnet进程。2. 使用命令 netstat -ano | findstr :20000(Windows) 或lsof -i:20000(Mac/Linux) 查看端口占用,并终止对应进程。3. 修改 StartConfig/中的配置文件,更换端口号。 |
| 客户端连接服务器超时或失败 | 1. 服务端未成功启动。 2. 客户端连接的IP/端口配置错误。 3. 防火墙/安全软件阻止了连接。 | 1. 确认服务端控制台有无报错,是否所有进程都显示“启动成功”。 2. 检查客户端初始化代码或配置表中的 Address(如127.0.0.1)和Port是否正确。3. 临时关闭防火墙测试,或添加对应端口的出入站规则。 |
| 热重载后,游戏逻辑未更新或报错 | 1. 代码未编译成功。 2. 修改的代码不在 Hotfix程序集中。3. 热重载过程中出现异常,导致部分加载失败。 | 1. 查看Unity控制台是否有编译错误,必须先解决所有编译错误。 2. 确保逻辑代码写在 Hotfix或HotfixView中,Model中的代码通常不支持热重载。3. 尝试完全停止游戏,重新运行,看是否是热重载的临时问题。复杂的结构改动有时需要重启。 |
| 打包后(尤其是IL2CPP),运行时报错或功能异常 | 1. 代码裁剪(Code Stripping)导致反射所需的类型或方法被移除。 2. AOT(预先编译)限制,某些动态代码无法运行。 | 1. 如果使用HybridCLR,务必严格按照其文档配置link.xml或UnityLinker,防止热更代码被裁剪。2. 检查是否在AOT限制下使用了泛型反射、动态创建委托等,HybridCLR提供了补充元数据的方法来解决。 3. 在Player Settings中,尝试降低“Code Stripping”级别为 Low或Minimal进行测试。 |
| 数据库(MongoDB)操作失败 | 1. MongoDB服务未启动。 2. 连接字符串配置错误。 3. 实体类未正确注册。 | 1. 确保MongoDB服务已在后台运行(mongod)。2. 检查 StartConfig中DB数据库的ConnectionString。3. 确保你的实体类(如 Player)继承了Entity,并且已在程序启动时通过ObjectSystem或其他方式注册。 |
| 帧同步游戏感觉“卡顿”或“回滚”频繁 | 1. 网络延迟或抖动过高。 2. 帧同步逻辑的“预测”与“验证”部分有BUG。 3. 服务器帧率(LockStep)与客户端帧率不匹配。 | 1. 使用KCP协议,并优化其参数(如Interval,FastResend)。2. 仔细检查预测逻辑(客户端本地先执行)和服务器权威逻辑是否严格一致,任何细微的随机数或浮点数误差都可能导致回滚。 3. 确保服务器和客户端的逻辑帧率(如每秒20帧)设置相同,并使用稳定的增量时间进行逻辑计算。 |
避坑心法:
- 日志是你的第一盟友:ET框架和Unity控制台的日志输出非常详细。遇到任何问题,第一步永远是仔细、完整地阅读错误日志和堆栈信息。90%的问题都能从中找到线索。
- 简化复现:当遇到一个复杂BUG时,尝试创建一个最小的、可复现的Demo场景。剥离所有不相关的系统,只保留能触发问题的最简代码。这不仅能帮你理清思路,也方便在社区求助。
- 理解“生命周期”:ET中的Entity、Component、System都有其特定的创建、更新、销毁生命周期。很多诡异的BUG(如空引用、数据残留)都是因为生命周期管理不当造成的。务必理清
Awake,Start,Update,Destroy等方法的调用时机。 - 善用分析器:ET框架内置了强大的Roslyn代码分析器。如果你写的代码不符合ET规范(比如在Component里写方法,而不是在System里),IDE(VS/Rider)会直接给出错误或警告提示。遵循这些提示,能避免很多架构上的错误。
这套《Unity ET开源框架视频教程》是一座宝库,但它不是魔法书。它能带你入门,展示最佳实践,但真正的精通,来自于在真实项目中的不断踩坑、填坑和思考。从模仿Demo开始,到尝试修改它,最后用它来创造你自己的游戏世界,这个过程本身就是对这套框架和这套教程价值的最好诠释。记住,框架是工具,思路才是灵魂。当你理解了ET为何这样设计,你就能更灵活地驾驭它,甚至在其基础上进行适合自己项目的改造。