INTERNAL / TRAINING docs/html/03.小白入门学习计划.html
2026-07-19
Learning Plan

Arrows 训练工程
小白入门学习计划

基于 GameClientTrainning 项目(Unity 6000 + Entitas ECS),为前端工程师量身定制的渐进式学习路线。从零基础到能独立开发新模块,预计 2-3 周完成。

引擎 Unity 6000.0.58f2
架构 Entitas ECS
目标读者 前端转型 Unity
预计周期 2-3 周
第零阶段

前置准备

装好环境,跑起来,先玩 5 分钟感受游戏。不用看任何代码。

事项做什么
打开工程 Unity Hub → Add → 选 GameClientTrainning 目录,Unity 版本 6000.0.58f2
跑起来 打开 Assets/_Game/Scenes/Home.unity → 点 Play,先玩 5 分钟
通关一轮 从第 1 关打到第 5 关,观察:箭头怎么拔、撞击怎么扣血、通关特效、奖励弹窗
验收标准
  • 能说出游戏有几个场景
  • 能说出主菜单长什么样
  • 能说出游戏中 HUD 显示什么信息
第一阶段

理解"骨架"——系统如何跑起来

核心问题:从点 Play 到游戏画面,代码是怎么走的?预计 2-3 天。

1.1

启动流程(按调用顺序读)

从场景加载到 ECS 初始化到 Update 循环。

文件看什么路径
HomeRoot.cs 主菜单入口,加载 HomeScreen 预制体 Assets/_Game/Home/HomeRoot.cs
GameRoot.cs 游戏入口:创建 ECS 世界 + Feature + 所有 View Assets/GameBase/App/GameRoot.cs
GameEnv.cs 看哪些东西在运行时被持有(Camera、Root、预制体) Assets/GameBase/App/GameEnv.cs
GameFeature.cs 最重要:所有系统的 Add 顺序 = 执行顺序 Assets/GameBase/App/GameFeature.cs
验收标准

能画出 "Play → GameRoot.Awake → GameFeature.Initialize → Update 循环" 的流程图。

1.2

理解 Entitas ECS 三要素

Component 存数据,System 改数据,Entity 组合数据。

概念前端类比本项目中的例子
Component 数据字段 AwardsComponent — 存 Total 和 LastLevelAwarded
System 逻辑处理 / watcher AwardGrantSystem — 响应通关事件,加奖励
Entity 多个 Component 的组合 GameEntity — 一个实体可同时有 CurrentLevel + Awards + Lives 等
Context 全局状态仓库 / store Contexts.sharedInstance.game — 所有 GameEntity 的容器
Group 筛选查询 / filter() System 只处理"拥有特定 Component 组合"的 Entity 集合
Matcher 查询条件 / selector Matcher<GameEntity>.Awards — 匹配所有有 Awards 组件的实体
验收标准

能用自己的话说清 "Component 存数据,System 改数据,Entity 组合数据"。

1.3

两种 System 的区别

ReactiveSystem = 事件驱动(类似 Vue watch),IExecuteSystem = 每帧轮询(类似 requestAnimationFrame)。

类型基类触发方式前端类比本项目例子
ReactiveSystem ReactiveSystem<GameEntity> 关心的 Component 变化时自动触发 Vue watch / useEffect deps AwardGrantSystem、LivesMistakeSystem
IExecuteSystem IExecuteSystem 每帧执行 requestAnimationFrame InputSystem、TimerSystem
关键理解:ReactiveSystem 只在关心的数据变化时才执行;IExecuteSystem 每帧都执行。前者省性能,后者适合需要持续运行的逻辑(如输入检测、计时器)。
第二阶段

逐一攻破业务模块

按复杂度从低到高,每天一个模块。预计 5-7 天。

2.1

Awards(奖励)——最简单的模块

你之前已经改过这个模块,正好复习。它是理解"数据进 Component → System 改 → Savegame 存 → View 显示"这套完整模式的入口。

文件看什么路径
AwardsComponents.cs[Game, Unique] 标记含义、组件字段定义Assets/_Game/Awards/Components/
AwardsFeature.cs怎么把系统聚合成 FeatureAssets/_Game/Awards/
GameAwardsComponent.cs生成的代码:SetAwards / ReplaceAwards 是自动写的Assets/Generated/Game/Components/
AwardGrantSystem.csReactiveSystem 怎么响应 LevelComplete 事件Assets/_Game/Awards/Systems/
AwardsSavegameSystem.cs运行时状态 ↔ 存档的双向同步Assets/_Game/Awards/Systems/
AwardsSavegame.cspartial class 扩展 GameSavegame 持久化字段Assets/_Game/Awards/Savegame/
AwardToast.csView 怎么在 Update 里读 ECS 数据并弹出Assets/_Game/Awards/Views/
AwardsCheatContainer.cs作弊容器:+1/+10/清零Assets/_Game/Awards/Cheats/
Awards 模块完整数据流 LevelComplete 触发 ↓ AwardGrantSystem.Execute → ReplaceAwards(total+1, currentLevel) ↓ AwardsSavegameSystem 响应 Awards 变化 → 写回子存档 + 标脏 ↓ SavegameWriteSystem 检测 Dirty → 落盘 JSON ↓ AwardToast.Update 检测 Total 变化 → 弹出 "+1 共 N"
验收标准

能说出从 LevelComplete 事件到奖励弹窗的完整数据流。

2.2

Lives(命值)——状态变化 + UI

理解标志位组件(MistakeComponent / LevelFailedComponent)和 UI 动态渲染(心形图标)。

文件看什么路径
LivesComponents.csMistakeComponent / LevelFailedComponent 标志位组件Assets/_Game/Lives/Components/
LivesMistakeSystem.csReactiveSystem 怎么响应 Mistake 事件 → 扣血Assets/_Game/Lives/Systems/
LevelFailSystem.cs命值归零 → 触发 isLevelFailedAssets/_Game/Lives/Systems/
GameHud.csHUD 怎么动态创建心形图标Assets/_Game/Lives/Views/
HeartView.cs单颗心的闪烁动画Assets/_Game/Lives/Views/
LivesCheatContainer.cs命值作弊:满血/扣血Assets/_Game/Lives/Cheats/
Lives 模块数据流 点击被挡住的箭头 ↓ ArrowClickSystem → isMistake = true ↓ LivesMistakeSystem → 扣血 + RemoveBlockedAfterMistake ↓ LevelFailSystem → 0 血 → isLevelFailed = true ↓ LevelFailPopup 监听到 → 弹出重试弹窗
验收标准

能说出 "碰箭头 → Mistake → 扣血 → 0血 → LevelFailed → 弹窗" 链路。

2.3

Levels(关卡)——数据加载 + 流程控制

理解关卡数据从 txt 文件到游戏场景的完整加载流程。

文件看什么路径
LevelData.cs关卡数据类,怎么从 txt 读Assets/_Game/Levels/Data/
LevelDifficultyUtil.cs难度工具类Assets/_Game/Levels/Data/
GameStateComponents.csCurrentLevel / LevelComplete / LevelFailed 等状态组件Assets/_Game/Levels/Components/
LevelStartSystem.cs加载关卡、创建箭头、创建点阵查找 LevelStartSystem
LevelCompleteSystem.cs通关后的逻辑查找 LevelCompleteSystem
LevelReloadSystem.cs重试/下一关查找 LevelReloadSystem
LevelSavegameSystem.cs关卡进度存档映射查找 LevelSavegameSystem
GridView.cs点阵的渲染Assets/_Game/Levels/Views/
附加练习:打开 Assets/_Game/Levels/Resources/Levels/level_1.txt,看看关卡数据文件长什么样。
验收标准

能打开 level_1.txt 解释每一行数字的含义。

2.4

Arrows(核心玩法)——最复杂的模块

理解箭头之间的阻挡关系、点击判定、移动动画、通关判断。

文件看什么路径
ArrowContainer.cs箭头的纯数据结构(方向、坐标、阻挡关系)Assets/_Game/Arrows/Data/
ArrowComponents.cs箭头的 ECS 组件Assets/_Game/Arrows/Components/
ArrowPointerDownSystem.cs手指按下箭头的处理Assets/_Game/Arrows/Systems/
ArrowClickSystem.cs核心:点击箭头的逻辑(拔出来 vs 撞到)Assets/_Game/Arrows/Systems/
ArrowTouchRemoveSystem.cs触摸移除箭头Assets/_Game/Arrows/Systems/
ArrowBlockSystem.cs阻挡判定Assets/_Game/Arrows/Systems/
ArrowMoveSystem.cs箭头的移动动画Assets/_Game/Arrows/Systems/
ArrowsCompleteSystem.cs判断是否全部拔完 → 触发通关Assets/_Game/Arrows/Systems/
ArrowView.cs箭头的渲染和动画Assets/_Game/Arrows/Views/
验收标准

能解释 "点击箭头 → 判断是否可以拔出 → 不是,被挡住了 → 扣血" 这个逻辑。

2.5

Input + 存档框架

理解输入如何从鼠标/触摸变成 ECS 事件,以及存档如何从 JSON ↔ GameSavegame ↔ 各业务子存档。

文件看什么路径
InputSystem.cs鼠标/触摸 → PointerDown / PointerClick / Drag 事件Assets/_Game/Input/Systems/
ArrowInputUtils.cs输入工具类Assets/_Game/Arrows/Systems/
GameSavegame.cspartial class 聚合存档的根Assets/GameBase/Savegame/
SavegameComponents.csSavegameComponent / SavegameDirtyComponentAssets/GameBase/Savegame/
ISavegameService.cs存档服务接口Assets/GameBase/Savegame/
JsonFileSavegameService.csJSON 文件落盘实现Assets/GameBase/Savegame/
SavegameLoadSystem.cs启动时读文件 → ComponentAssets/GameBase/Savegame/
SavegameWriteSystem.cs有脏标记 → 写文件Assets/GameBase/Savegame/
SavegameFeature.cs存档框架的 FeatureAssets/GameBase/Savegame/
存档架构全流程 游戏启动 ↓ SavegameLoadSystem → 从 JSON 文件读取 GameSavegame → 设到 SavegameComponent ↓ 各业务 Feature 的 SavegameSystem.Initialize → 从 GameSavegame 读子存档 → 设到运行时 Component ↓ [游戏中:AwardGrantSystem 改奖励、LevelCompleteSystem 推进度...] ↓ 各业务 SavegameSystem.Execute → 把运行时值写回子存档 → isSavegameDirty = true ↓ SavegameWriteSystem → 检测到 Dirty → 序列化 GameSavegame → 写 JSON 文件
验收标准

能画出存档的读写流程图(JSON 文件 ↔ SavegameComponent ↔ 各业务子存档)。

第三阶段

动手实战

把学到的东西写出来。预计 3-5 天。

3.1

任务 1:新增 Score(分数系统)

模仿 Awards 模块,从头新建一个分数模块。这是检验你是否真正理解 ECS 模式的最佳方式。

ScoreComponents.cs
Required
[Game, Unique]CurrentScore
ScoreSystem.cs
Required
监听 LevelComplete,每次通关 +100 分
ScoreSavegame.cs
Required
partial class GameSavegame 加持久化字段
ScoreSavegameSystem.cs
Required
"子存档 ↔ 运行时状态" 双向同步
ScoreFeature.cs
Required
聚合本模块系统,在 GameFeature 中注册
GameHud 显示
Required
在 GameHud.cs 里显示分数
ScoreCheatContainer.cs
Optional
+100 / +1000 / 清零 作弊项
ScoreView.cs
Optional
得分时弹出 +100 飘字动画
验收标准

通关后 HUD 上分数 +100,存档退出重进分数还在。

3.2

任务 2:主菜单显示累计奖励

在 HomeScreenView.cs 里读 ECS 数据并渲染到 UI。练习 View 层的读数据模式。

HomeScreenView.cs
Modify
添加逻辑:读 contexts.game.awards.Total 并显示在主菜单上
验收标准

主菜单上能看到 "已获得 N 个奖励"。

第四阶段

进阶(选做)

深入理解代码生成、算法细节、测试框架。

内容难度说明
理解 Jenny 代码生成流程 中等 跑一次 Jenny.exe gen,理解哪些文件是生成的、哪些是手写的
看懂 ArrowContainer 算法 困难 箭头之间的 block 关系怎么算出来的
理解 CheatPanel 反射机制 中等 怎么自动发现所有 AbstractCheatContainer 子类
理解 SavegameSmokeTest 中等 怎么用代码模拟一次完整的游戏流程并校验
理解 CheatSmokeTest 简单 验证所有作弊项都能正常执行
理解 SmokeTest 简单 通用冒烟测试框架

Jenny 代码生成流程

当你在 Components 文件里新增/修改了 [Game] 标记的组件后,需要重新生成代码。

代码生成方式 方式 A(命令行): 1. Unity -batchmode -executeMethod CodegenSync.SyncSolution → 生成 .csproj 2. mono ./Jenny/Jenny.exe gen → 重新生成 Generated/ 目录下的 ECS 代码 方式 B(Unity Editor): Tools → Entitas → Generate
关键理解:哪些是生成的?
Assets/Generated/ 下所有文件 — 自动生成,不要手改
Assets/_Game/Assets/GameBase/ 下 — 手写代码
速查

工程结构速查

随时翻回来找文件。

目录说明
Assets/GameBase/App/GameRoot / GameFeature / GameEnv
Assets/GameBase/Ecs/GameAttribute([Game] 上下文属性)
Assets/GameBase/Savegame/存档框架(IO + 脏标记,不关心业务内容)
Assets/GameBase/Cheats/作弊框架(反射收集 + 面板渲染)
Assets/GameBase/Destroy/实体销毁
Assets/GameBase/Timer/通用计时器
Assets/GameBase/Tools/纯几何算法
Assets/GameBase/Ui/UGUI 构建助手
Assets/GameBase/Editor/编辑器工具
Assets/_Game/Home/主入口菜单
Assets/_Game/Arrows/核心玩法:箭头
Assets/_Game/Levels/关卡:加载/流程/点阵
Assets/_Game/Input/输入:鼠标/触摸 → 指针事件
Assets/_Game/Lives/命值:3 条命 / 撞击扣血 / 失败重来
Assets/_Game/Awards/奖励:通关累计 + 弹窗提示
Assets/_Game/Hud/游戏内 HUD
Assets/_Game/Themes/配色主题
Assets/_Game/Scenes/Home.unity / Main.unity
Assets/Generated/Jenny 生成的 ECS 代码(不要手改)
Assets/Entitas/Entitas ECS 运行时
Assets/Plugins/Demigiant/DOTween 补间动画
Jenny/代码生成工具(Jenny.exe + 插件 dll)
建议

学习建议

一些帮你少走弯路的经验。

学习方法
  • 不要跳着看 — 按 1→2→3 阶段的顺序来,每个模块之间有依赖关系
  • 随时问 AI Agent — 遇到看不懂的代码,切到开发 Agent 让她解释
  • 改代码是最好的学习 — 每个模块看完后,试着改一个小东西(比如改奖励数值、改命数)
关键心智模型
  • 数据驱动:这项目不是传统的 GameObject 满天飞,而是一切状态都在 Component 里,View 只是展示层。类比:Component = Vuex store,System = mutations,View = template。
  • Feature 模式:GameFeature 里 Add(...) 的顺序 = 系统执行顺序。比如存档系统必须先于业务系统加载。
  • 单例组件[Unique] 标记的组件在整个 Context 里只有一份,通过 context.game.awards 直接访问。类比:全局唯一的 Vuex module。
遇到报错怎么办?
1. 先看 Console 窗口的错误信息(Window → General → Console)
2. 双击错误跳转到对应代码行
3. 如果涉及 Generated/ 目录的文件,可能是没重新生成代码 → 执行 Jenny gen
4. 如果还是解决不了 → 问 AI Agent