Scene
一个运行场景。对 2D 产品来说,经常近似理解为“启动环境 / 页面集合 / UI 流程入口”。文件通常是 `.unity`。
Lesson 3 / 6
用 HappyMahjong 真实链路讲清 Scene、UI Root、GameObject、Component、Prefab。只讲 2D UI,不进入 3D 世界。
UIEventListener 保留是因为点击绑定方便,Empty Click / EmptyClick 用来接收空白或遮罩点击。Hierarchy 是对象树,Scene/Game 是画面,Inspector 是组件和序列化引用。产品看入口,后台追脚本。
页面/弹窗不一定写死在当前 Scene 里,可能由资源加载和 Context 绑定出来。
这张图只用于定位,不要求新手理解热更和资源加载细节。Product 只需要知道“页面/弹窗不一定在当前 Scene 里”;Backend 只需要能追到“哪个 View / Mediator / Command 处理点击”。
一个运行场景。对 2D 产品来说,经常近似理解为“启动环境 / 页面集合 / UI 流程入口”。文件通常是 `.unity`。
对象容器。它本身功能很少,功能来自挂载的 Component。
挂在 GameObject 上的功能模块。HappyMahjong 2D UI 常见有 UGUI 的 Canvas / Image / Button、项目保留的 UIEventListener、Empty Click 接收对象,以及自定义 MonoBehaviour。
可复用对象模板。修改 Prefab 可能影响所有实例;让 agent 大规模手写 Prefab YAML 是高风险行为。
大多数 2D UI 小需求不是新建系统,而是找对组件、沿用绑定、避免遮挡和布局问题。
| 组件 / 配置 | 解决什么问题 | 常见坑 |
|---|---|---|
Canvas | UI 根和渲染层级。 | 不要为小弹窗随手新建孤立 Canvas。 |
RectTransform | UI 位置、尺寸、Anchor、Pivot。 | 文案或按钮位置异常时先看 Anchor / Pivot。 |
Button / Toggle | 点击和勾选输入。 | 绑定可能在 Inspector、代码或 UIEventListener 中。 |
Text / TMP_Text / Image | 文案、图标、状态显示。 | 文案挤爆时先查 Layout,不要直接改 Prefab 层级。 |
CanvasGroup / Raycast Target | 点击是否能穿透或被阻挡。 | 按钮点不到时优先查遮挡、blocksRaycasts、Raycast Target。 |
LayoutGroup / ContentSizeFitter | 列表、动态文案、自动布局。 | 手动改位置可能和自动布局打架。 |
| 层次 | 例子 | 新手 + agent 风险 |
|---|---|---|
| 普通 C# 逻辑 | 输入校验、DTO 转 Model、Command 内部状态规则 | 低;最适合 agent 和 Edit Mode Test。 |
| View / Mediator 薄层 | 按钮事件转发、读取输入框、渲染文本、dispatch 事件 | 中;要检查生命周期、Inspector 引用和 Context 绑定。 |
| Prefab / Scene 配置 | 新增按钮、拖拽引用、调整层级 | 高;优先人工编辑器操作或让 agent 输出步骤。 |
| ProjectSettings / Packages | 升级 UI 包、改构建设置 | 很高;一小时课内禁止。 |
{Module}Context // 绑定 Model、Service、View → Mediator、事件 → Command
{Module}View // UI View:接按钮 / UIEventListener / Empty Click,显示状态,dispatch View 事件
{Module}Mediator // View 事件 → StrangeIoC 事件
{Module}Command // 业务流程
{Module}Service // 服务层
{Module}Model // 状态
Why — 先从 *Context.cs 看绑定,再追 View → Mediator → Command → Service / Model,是 HappyMahjong 里最靠谱的读法。不管哪个模块,链路结构一致。
哪个改动最适合作为 agent 的第一批 Unity 任务?
课后阅读 Unity 官方 Prefabs 文档。项目内优先读 Docs/02-systems/ui-system.md 和 Docs/01-flows/login-flow.md。课堂只需记住:Prefab 是模板,修改它会影响实例,agent 不应该无边界修改它。