用 ECS 架构重审 Unity 动画与技能系统

这门课的核心命题很明确:如何在 Unity 中基于 Entity Component System(ECS)架构,构建一套逻辑清晰、易于维护的角色技能系统。对于已经接触过 Entitas 基础,或在实际项目中感到“ MonoBehaviour 臃肿”、“状态机难管”的开发者来说,这是一个从“能跑起来”到“写得优雅”的关键进阶点。课程以《武士2》为实战载体,并非单纯讲解 Animator 组件的使用,而是聚焦于**数据驱动下的行为控制**——即如何让 ECS 的数据变更,精准、高效地驱动动画系统的播放与切换。

适合谁,以及学习前的门槛

本课适合具备以下条件的学员:
- 已掌握 Unity 基础开发流程,熟悉 C# 编程;
- 对 Entitas 的基本概念(Entity、Component、System、Context)有实际操作经验,不是一知半解;
- 曾尝试用传统脚本管理角色技能,但遇到状态混乱、逻辑耦合严重的问题,希望寻找更结构化的解决方案。

如果你尚未理解 ECS 与 OOP 在设计哲学上的差异,建议先补强 Entitas 第一季内容。本课程默认你已能独立搭建简单的 ECS 框架,重点在于如何在**系统层**与**动画层**之间建立清晰、低耦合的通信机制。

学习路径与资料配合建议

建议按以下顺序消化课程内容:
1. **优先理解 Animator 辅助工具的实现逻辑**。这是本课的亮点——它不是黑盒调用,而是通过代码封装,让 System 能安全、直观地控制 Animator 状态机。掌握此工具,意味着你能摆脱对 Animator Controller 面板的过度依赖,实现动画驱动的代码化。
2. **跟随技能系统的实现步骤**。重点关注“输入—判定—执行—反馈”这条链路如何在 ECS 中拆分到不同 System 中,以及 Component 如何承载技能状态数据。
3. **留意穿插的优化与编程技巧**。课程在实现过程中会提及性能优化点(如避免频繁装箱、缓存引用等)和 C# 特性应用,这些是提升代码质量的细节,值得结合实践笔记记录。

学习时,务必边看边动手复现。不要只看不写,尤其是辅助工具部分,亲手实现一遍才能真正理解“操作 Animator”背后的数据流。完成后可尝试替换角色模型或扩展新技能类型,验证你对架构的理解是否稳固。

学完本课,你将能够:独立设计并实现基于 ECS 的角色技能系统;熟练运用自定义工具管理 Animator 状态机;在复杂行为逻辑下保持代码的高内聚与低耦合;为后续开发更大型的游戏系统(如装备、Buff、AI)打下坚实的架构基础。

课程目录

QQ_1763873114141.png (84.

04 KB,  ) 2025-11-23 12:

46 上传 课程介绍: 第二季主题:人物技能系统及Animator的使用 本课程使用ECS架构实现武士这个游戏,这一季主要讲解Unity Animator的功能以及人物技能的实现 另外实现了一个操作Animator的辅助工具,可以让操作更加便捷,在制作这个工具的过程中,可以让大家对Aniamtor理解的更加深入! 课程中还会穿插各种优化及编程小知识,希望大家用心听讲哈! 课程目录: 000-演示视频.mp4
 101-动画状态机讲解.mp4
 102-代码创建状态机常见问题.mp4
 103-人物技能子状态机.mp4
 104-人物技能识别码设计思路.mp4
 105-添加人物技能判定系统.mp4
 106-修改代码生成工具的问题.mp4
 107-添加人物技能计时部分.mp4
 108-添加连续按键的判定.mp4
 109-有效技能处理部分.mp4
 110-技能编码服务.mp4
 111-技能编码功能模块.mp4
 112-获取当前的技能编码.mp4
 113-存储当前技能编码.mp4
 114-测试已有部分功能.mp4
 115-测试人物技能部分功能(1).mp4
 116-测试人物技能部分功能(2).mp4
 117-根据需求调整人物行为接口.mp4
 118-人物技能部分状态机讲解.mp4
 119-状态机脚本讲解.mp4
 120-获取技能编码字符串.mp4
 121-获取技能编码数值.mp4
 122-验证string编码转换函数功能.mp4
 123-int编码转换成编码名称函数功能及验证.mp4
 124-完成技能参数重置.mp4
 125-添加新的动画逻辑.mp4
 126-代码控制持刀动作部分.mp4
 127-持刀动作和非持刀动作的切换.mp4
 128-调整计时器逻辑.mp4
 129-处理状态切换遇到的问题.mp4
 130-UI轴心点的应用小技巧.mp4
 131-技能显示部分UI设置.mp4
 132-预制体设置.mp4
 133-生成子项部分逻辑.mp4
 134-子项缓存.mp4
 135-数据组件类.mp4
 136-人物技能子项类.mp4
 137-完成技能UI显示逻辑.mp4
 138-添加游戏内UI控制脚本.mp4
 139-自动化生成UI.mp4
 140-自动化挂载UI脚本.mp4
 141-技能UI功能验证.mp4
 142-添加技能编码监听.mp4
 143-完善监听部分功能.mp4
 144-添加UI渐隐扩展方法.mp4
 145-完成Image渐隐渐现效果.mp4
 146-完成UI效果的添加.mp4
 147-完善计时器接口.mp4
 148-优化代码.mp4
 149-人物技能部分配置.mp4
 150-整理技能判断部分逻辑.mp4
 151-调整输入技能部分逻辑.mp4
 152-数据服务.mp4
 153-添加自己的数据类型.mp4
 154-完成技能数据服务部分初始化.mp4
 155-筛选当前关卡的有效技能.mp4
 156-判定技能编码是否有效.mp4
 157-获取有效编码.mp4
 158-切记要在信息源头处理信息.mp4
 159-在输入部分筛选技能编码.mp4
 160-验证已有功能.mp4
 161-修复技能编码为0的情况.mp4
 162-获取有效编码.mp4
 163-Game上下文下技能响应系统.mp4
 164-整体检验动画部分功能.mp4
 165-动画状态机与代码的不协调性.mp4
 166-自定义动画事件设计思路.mp4
 167-遍历Animator所有状态.mp4
 168-缓存动画状态.mp4
 169-添加自定义事件.mp4
 170-接口部分的添加.mp4
 171-调整事件的绑定方式.mp4
 172-行为的判定方式.mp4
 173-创建行为状态组件.mp4
 174-人物行为状态响应系统.mp4
 175-行为状态脚本的结构整理.mp4
 176-优化行为接口.mp4
 177-调整行为功能.mp4
 178-解决Animator脚本对象问题.mp4
 179-解决Animator脚本名称问题.mp4
 180-解决人物转向突兀问题.mp4
 201-刀光特效思路整理.mp4
 202-添加刀光部分基础方法.mp4
 203-添加监听及加载预制.mp4
 204-添加技能开始和结束监听.mp4
 205-整理技能部分动画事件系统.mp4
 206-完成技能部分脚本名称的修改.mp4
 207-添加技能事件调用部分.mp4
 208-技能管理类.mp4
 209-播放技能部分逻辑.mp4
 210-完成技能管理部分.mp4
 211-播放技能组件.mp4
 212-完成技能动画参数的重置.mp4
 213-刀光渐隐渐显效果.mp4
 214-完成效果脚本的绑定及调用.mp4
 215-unity中一些参数的设置小技巧.mp4
 216-完善刀光细节.mp4
 217-刀光隐藏部分设计思路.mp4
 218-刀光特效部分代码实现.mp4
 219-特效初始化部分代码调整.mp4
 220-验证调整后的功能.mp4
 221-刀光效果调整.mp4
 222-灰尘动画的逻辑.mp4
 223-灰尘动画效果优化逻辑部分.mp4
 224-灰尘动画效果优化效果部分.mp4
 225-攻击震动效果设计.mp4
 226-攻击震动效果实现及优化.mp4
 301-声音部分优化技巧.mp4
 302-AssetPostprocessor类介绍.mp4
 303-自动设置音频参数.mp4
 304-图片导入部分优化技巧.mp4
 305-图片导入部分逻辑编写.mp4
 306-人物音效部分接口.mp4
 307-关于编程的一点小想法.mp4
 308-大部分情况下我们说的“接口”是这个意思.mp4
 309-音效播放部分逻辑.mp4
 310-音效加载部分的逻辑.mp4
 311-完善音效部分功能.mp4
 312-验证音效部分功能.mp4
 313-解决攻击音效执行两次的问题.mp4
 314-挥刀声音优化.mp4
 315-移动音效功能.mp4
 316-移动音效实现.mp4
 317-优化脚步声.mp4
 401-Git无法识别AnimatorController的修改?看这里!.mp4
 402-Animator基础知识.mp4
 403-animator状态切换的慢?看这里!.mp4
 404-工具存在的意义.mp4
 405-animator工具介绍.mp4
 406-获取animator当前层的所有状态.mp4
 407-移除过渡状态.mp4
 408-获取所有子状态机.mp4
 409-通过名称获取子状态机.mp4
 410-获取子状态机的所有状态.mp4
 411-获取指定过渡状态.mp4
 412-添加资源界面右键拓展菜单.mp4
 413-MenuItem参数之检验函数.mp4
 414-MenuItem参数之优先级.mp4
 415-工具需求思路.mp4
 416-Animator辅助工具.mp4
 417-序列化对象及属性.mp4
 418-在EditorWindow中显示数组.mp4
 419-获取资源中的动画片段.mp4
 420-注意!获取动画片段是由坑的.mp4
 421-提供资源的另一种选择方式.mp4
 422-创建GenerateController.mp4
 423-添加动画片段到状态机中.mp4
 424-验证已有功能.mp4
 425-动画状态的排列.mp4
 426-后续需求分析.mp4
 427-可排序列表的显示.mp4
 428-子状态机数据部分.mp4
 429-添加列表的绘制事件.mp4
 430-调整视图错误.mp4
 431-修改元素的初始化数值.mp4
 432-Add回调常见问题.mp4
 433-元素列表高度自适应.mp4
 434-对话框提示.mp4
 435-自定义属性外观类.mp4
 436-子属性的外观修改.mp4
 437-调整由于样式修改引发的问题.mp4
 438-创建子状态机.mp4
 439-调整代码结构.mp4
 440-完成状态机创建部分逻辑.mp4
 441-功能演示及便利操作的设计思路.mp4
 442-添加状态机选择复选框.mp4
 443-自动添加动画资源快捷操作.mp4
 444-重复项筛选.mp4
 445-Animator操作辅助面板部分.mp4
 446-AnimatorHelpManager.mp4
 447-完成添加帮助脚本逻辑.mp4
 448-验证功能.mp4
 449-辅助工具需求分析.mp4
 450-通过名称哈希值获取状态.mp4
 451-状态机数据的持久化.mp4
 452-通过数据获取状态机.mp4
 453-添加获取状态机所有状态的扩展方法.mp4
 454-已有辅助功能验证.mp4
 455-复选框部分逻辑.mp4
 456-显示过渡状态的复选框.mp4
 457-编辑器面板数据的保存.mp4
 458-全选按钮.mp4
 459-优化界面显示.mp4
 460-批量修改参数设计思路.mp4
 461-添加自己的特性类.mp4
 462-添加多选枚举的显示.mp4
 463-位运算的基本概念.mp4
 464-枚举的位运算.mp4
 465-参数部分的显示.mp4
 466-确认修改部分逻辑.mp4
 467-通过反射同一修改属性值.mp4
 468-验证工具修改功能.mp4
 469-完善全选按钮逻辑.mp4
 470-参数部分的显示控制.mp4
 471-编写插件为了让你更懂Animator.mp4
 501-结束语:小知识点都在课程的角落里.mp4