<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>石磨豆浆</title><description>充满鲜花的世界到底在哪里</description><link>https://smdj-p.com/</link><templateTheme>Firefly</templateTheme><templateThemeVersion>6.10.7</templateThemeVersion><templateThemeUrl>https://github.com/CuteLeaf/Firefly</templateThemeUrl><lastBuildDate>2026年5月30日 16:34:15</lastBuildDate><item><title>基于 Unity URP 的 2D 横版动作游戏——项目架构解析</title><link>https://smdj-p.com/posts/unity-2d-action-game/</link><guid isPermaLink="true">https://smdj-p.com/posts/unity-2d-action-game/</guid><description>基于 Unity 2022.3 URP 开发的 2D 横版动作游戏，实现了完整的角色控制、战斗、AI、任务、背包、对话与存档系统。</description><pubDate>Sat, 30 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;项目概述&lt;a href=&quot;#项目概述&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;基于 Unity 2022.3 URP 的 2D 横版动作游戏，实现了完整的角色控制、战斗、AI、任务、背包、对话与存档系统。项目采用&lt;strong&gt;管线式架构&lt;/strong&gt;驱动角色逐帧逻辑，通过 ScriptableObject 配置静态数据，遵循&lt;strong&gt;构造器注入&lt;/strong&gt;、&lt;strong&gt;职责分离&lt;/strong&gt;等设计原则，实现了高度模块化与可扩展的代码结构。&lt;/p&gt;&lt;p&gt;角色控制器基于此框架编写： &lt;a href=&quot;%60https://github.com/bunkerboy258/BBB-Nexus%60&quot;&gt;控制器源码&lt;/a&gt; / &lt;a href=&quot;%60https://www.bilibili.com/video/BV1X2XZBDEDq/%60&quot;&gt;B站教程&lt;/a&gt;&lt;/p&gt;&lt;p&gt;本源码地址：&lt;a href=&quot;https://gitee.com/smdjzzz/2-daction&quot; target=&quot;_blank&quot;&gt;石磨豆浆/2DAction&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;一、核心架构：角色控制器&lt;a href=&quot;#一核心架构角色控制器&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1.1 三大管线 + 数据黑板&lt;a href=&quot;#11-三大管线--数据黑板&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;整个控制器围绕 &lt;strong&gt;数据黑板 RuntimeData&lt;/strong&gt; 展开，所有管线与状态机均通过黑板读写帧级运行时数据，避免直接耦合。&lt;/p&gt;&lt;p&gt;每帧的处理流水线如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Update:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;① TimeManager 计算缩放时间&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;② ArbiterPipeLine     → 仲裁待处理的伤害/动作/交互请求&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;③ InputPipeLine       → 采集原始输入，维护按键缓冲计时&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;④ MainProcessorPipeLine → 输入→意图翻译 → 意图→参数计算&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;⑤ StateMachine.LogicUpdate → 当前状态逻辑（含打断检测）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;⑥ 表现层更新（音频、残影等）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LateUpdate:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;① StateMachine.PhysicsUpdate → 物理驱动（MotionDriver）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;② HitBoxController  → 攻击判定（依赖 Animator 结算后的动画状态）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;③ ArbiterPipeLine 后处理&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;④ RuntimeData.ResetIntents → 清理帧级意图标志&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Pipeline / Arbiter / Processor 均为纯 C# 类&lt;/strong&gt;，在 &lt;code&gt;SmdjCharacterController.Awake()&lt;/code&gt; 中通过构造器注入依赖完成组装，不依赖 Unity 生命周期，便于单元测试与逻辑复用。&lt;/p&gt;&lt;section&gt;&lt;h4&gt;1.1.1 RuntimeData —— 数据黑板&lt;a href=&quot;#111-runtimedata--数据黑板&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;存放玩家的帧级输入意图（&lt;code&gt;WantToJump&lt;/code&gt;、&lt;code&gt;WantToAttack&lt;/code&gt; 等）、物理状态（&lt;code&gt;IsGrounded&lt;/code&gt;、&lt;code&gt;IsDashing&lt;/code&gt;、&lt;code&gt;FacingDirection&lt;/code&gt; 等）、仲裁标志 &lt;code&gt;ArbitrationFlags&lt;/code&gt;、伤害请求队列，以及当前帧的 &lt;code&gt;ScaledDeltaTime&lt;/code&gt; 和 &lt;code&gt;EffectiveTimeScale&lt;/code&gt;。帧级意图在 &lt;code&gt;LateUpdate&lt;/code&gt; 末尾统一清零。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;1.1.2 InputPipeLine —— 输入管线&lt;a href=&quot;#112-inputpipeline--输入管线&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;通过 &lt;code&gt;IInputSource&lt;/code&gt; 接口抽象输入源（项目使用 Unity Input System），每帧获取原始按键状态（&lt;code&gt;RawInputData&lt;/code&gt;，区分按下/按住），并根据 SO 中配置的边沿缓冲时间维护按键缓冲计时；同时对外暴露 &lt;code&gt;ConsumeXxxPressed()&lt;/code&gt; API，供各 State 消费已缓冲的输入。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;1.1.3 MainProcessorPipeLine —— 意图翻译管线&lt;a href=&quot;#113-mainprocessorpipeline--意图翻译管线&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;采用&lt;strong&gt;双阶段处理&lt;/strong&gt;架构：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IntentProcessor&lt;/strong&gt;：根据输入缓冲数据 + 仲裁标志，翻译为意图标志写入 RuntimeData（如 &lt;code&gt;JumpIntentProcessor&lt;/code&gt; 判断地面/二段跳条件，设置 &lt;code&gt;WantToJump&lt;/code&gt; 或 &lt;code&gt;WantToDoubleJump&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ParameterProcessor&lt;/strong&gt;：完全基于 RuntimeData 的当前状态推导运动参数（如根据 &lt;code&gt;IsGrounded&lt;/code&gt; 的前后帧变化推断起跳/落地）&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;1.1.4 ArbiterPipeLine —— 仲裁管线&lt;a href=&quot;#114-arbiterpipeline--仲裁管线&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;在 InputPipeLine 之前执行，设置仲裁标志决定当帧哪些行为被禁止。采用”总管 + 子仲裁器”架构：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ActionArbiter&lt;/strong&gt;：处理动作覆盖请求，执行状态切换&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HealthArbiter&lt;/strong&gt;：处理伤害请求队列，角色死亡时禁止输入/攻击/移动，触发死亡状态&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;InteractArbiter&lt;/strong&gt;：处理交互请求&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;1.2 有限状态机 + 打断器&lt;a href=&quot;#12-有限状态机--打断器&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;状态机采用经典的 &lt;code&gt;Enter / LogicUpdate / PhysicsUpdate / Exit&lt;/code&gt; 四阶段模型，&lt;code&gt;StateMachine&lt;/code&gt; 负责状态切换与生命周期管理。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;核心创新：打断器（Interceptor）机制&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;PlayerBaseState.LogicUpdate()&lt;/code&gt; 被 &lt;code&gt;sealed&lt;/code&gt; 修饰为模板方法，先遍历全局打断器检测，未命中才执行自身逻辑：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LogicUpdate (sealed)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;├── CheckInterrupt()  → GlobalInterruptProcessor 遍历所有 Interceptor&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│   └── 命中 → ChangeState(newState) → return（跳过原状态逻辑）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└── UpdateStateLogic()  → 执行当前状态的正常逻辑&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;子打断器继承 &lt;code&gt;StateInterceptorSO&lt;/code&gt;（ScriptableObject），定义具体的打断条件与目标状态，按优先级注册到 &lt;code&gt;BrainSO&lt;/code&gt; 中。此机制解决了多状态切换关系复杂时的耦合问题，新增状态过渡只需新增一个 Interceptor 而无需修改既有状态代码。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;1.3 动画外观模式&lt;a href=&quot;#13-动画外观模式&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;通过 &lt;code&gt;IAnimationFacade&lt;/code&gt; 接口抽象动画操作（播放、过渡、设置回调、获取归一化时间等），项目实现了对 Unity Animator 的外观封装 &lt;code&gt;AnimatorFacade&lt;/code&gt;。State 通过 &lt;code&gt;AnimPlayOption&lt;/code&gt; 结构体描述播放参数，调用 &lt;code&gt;IAnimationFacade.PlayClip(clip, option)&lt;/code&gt; 驱动动画——动画系统与状态逻辑完全解耦，可随时替换底层动画方案。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;1.4 MotionDriver —— 物理驱动分离&lt;a href=&quot;#14-motiondriver--物理驱动分离&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;将角色物理运动逻辑从各 State 的 &lt;code&gt;PhysicsUpdate&lt;/code&gt; 中抽离到独立的 &lt;code&gt;MotionDriver&lt;/code&gt; 类中，实现 &lt;strong&gt;State 专注状态处理，MotionDriver 专注物理驱动&lt;/strong&gt; 的职责分离。MotionDriver 基于 RuntimeData 中的运动意图与 SO 中的物理参数（重力、最大速度等）计算并施加刚体力。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;二、战斗系统&lt;a href=&quot;#二战斗系统&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;2.1 攻击数据驱动&lt;a href=&quot;#21-攻击数据驱动&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;攻击行为通过 &lt;code&gt;AttackSO&lt;/code&gt; / &lt;code&gt;AttackAnimData&lt;/code&gt; 配置，包含：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;攻击动画 Clip&lt;/li&gt;
&lt;li&gt;运动曲线（AnimationCurve）——用于定义攻击过程中的强制位移（如”后撤步再突刺”），通过归一化时间采样，由 MotionDriver 驱动&lt;/li&gt;
&lt;li&gt;连击窗口时间&lt;/li&gt;
&lt;li&gt;攻击预制体类型（通过枚举 + SO 预制体工厂映射获取）&lt;/li&gt;
&lt;li&gt;技能冷却时间&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;AttackState 中根据攻击数据执行：动画播放 → 运动曲线驱动位移 → 攻击预制体生成 → 连击窗口判定。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.2 伤害系统&lt;a href=&quot;#22-伤害系统&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IDamageable&lt;/strong&gt; 接口：定义可受击物体的行为（是否可被伤害、接收伤害请求）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DamageSO&lt;/strong&gt;（策略模式）：传入伤害数据与目标对象，执行具体伤害逻辑。项目实现了 &lt;code&gt;SimpleDamageSO&lt;/code&gt;（直接伤害）和 &lt;code&gt;KnockbackDamageSO&lt;/code&gt;（含击退）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IAttackableItem&lt;/strong&gt;：攻击手段的抽象，持有 DamageSO 策略，通过 Collider 检测 IDamageable 并应用伤害。项目实现了区域伤害（地刺）、近战伤害、投射伤害三种类型&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;伤害请求队列&lt;/strong&gt;：玩家与敌人均使用队列存储同帧内的多个伤害请求，避免多段伤害同帧命中的数据竞争&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.3 敌人 AI&lt;a href=&quot;#23-敌人-ai&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;敌人采用与玩家角色&lt;strong&gt;镜像架构&lt;/strong&gt;——同样拥有 RuntimeData、状态机、MotionDriver、SO 配置系统，复用相同的设计模式。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;行为流程&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;巡逻(Patrol) → 检测到玩家进入视野 → 追击(Chase)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;→ 进入攻击距离 → 攻击前摇 → 攻击(Attack)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;→ 追击超时/丢失玩家 → 等待(Idle) → 返回(Return) / 巡逻(Patrol)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;→ 死亡(Dead)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;关键组件&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;EnemyDetectionZone&lt;/code&gt;：通过 Collider 划定敌人视野范围，玩家进出时更新 RuntimeData 中的目标记录&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PatrolArea&lt;/code&gt;：定义巡逻边界，巡逻状态下优先检查追击条件，再检查边界&lt;/li&gt;
&lt;li&gt;&lt;code&gt;EnemyAttackState&lt;/code&gt;：增加攻击前摇阶段，前摇结束后执行实际攻击判定&lt;/li&gt;
&lt;li&gt;&lt;code&gt;EnemySkillState&lt;/code&gt;：技能状态，支持类似玩家的技能释放逻辑&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;三、时间管理模块&lt;a href=&quot;#三时间管理模块&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;TimeManager&lt;/code&gt; 提供多通道时间缩放能力，支持帧冻结、子弹时间、暂停，以及按对象分组的独立时间层。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;全局时间缩放&lt;/strong&gt; = 帧冻结系数 × 子弹时间系数 × 暂停系数 × Debug 系数，每个子系数独立设置，同步更新全局缩放。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;时间层（TimeLayer）&lt;/strong&gt;：每个 TimeLayer 拥有独立的 &lt;code&gt;LayerTimeScale&lt;/code&gt;，与全局系数相乘得到层有效时间系数。所有受时间管理影响的 Mono 继承 &lt;code&gt;TimeLayerableBase&lt;/code&gt;，注册到对应时间层，每帧接收 &lt;code&gt;ScaledDeltaTime&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;设计考量&lt;/strong&gt;：动画、物理运动、前摇计时使用时间管理器的时间（受时缓影响），而受击无敌间隔使用 &lt;code&gt;UnscaledDeltaTime&lt;/code&gt;，确保时缓下敌人的受击间隔不变，实际 DPS 不受影响。项目中实际应用了玩家对敌人层施加的时缓技能。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;四、任务系统&lt;a href=&quot;#四任务系统&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;QuestManager&lt;/code&gt; 作为纯 C# 单例，管理任务从接取 → 推进 → 完成/待交的完整生命周期。通过 &lt;code&gt;EventCenter&lt;/code&gt; 驱动进度更新，配合 &lt;code&gt;QuestPanel&lt;/code&gt; 实现 UI 呈现。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;数据流&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;游戏行为 → 广播 EventCenter 事件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;→ QuestManager.OnObjectiveEvent() 回调&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;→ QuestInstance.UpdateProgress()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;→ QuestObjectiveInstance.AddProgress()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;→ 广播 QuestObjectiveUpdated 事件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;→ UI 更新&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;→ 全部目标完成 → 根据 needConfirmToComplete 策略决定待交NPC确认或自动完成&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;→ 广播 QuestCompleted 事件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;配置层&lt;/strong&gt;：&lt;code&gt;QuestSO&lt;/code&gt; + &lt;code&gt;QuestObjective&lt;/code&gt; 定义任务配置，运行时构造为 &lt;code&gt;QuestInstance&lt;/code&gt; + &lt;code&gt;QuestObjectiveInstance&lt;/code&gt;，通过闭包注册事件监听器来推进任务进度。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;五、交互与对话系统&lt;a href=&quot;#五交互与对话系统&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;5.1 交互模块&lt;a href=&quot;#51-交互模块&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;基于 &lt;code&gt;IInteractable&lt;/code&gt; + &lt;code&gt;IInteractTrigger&lt;/code&gt; 接口设计：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;IInteractTrigger&lt;/code&gt; 持有 &lt;code&gt;IInteractable&lt;/code&gt;，触发后调用 &lt;code&gt;Interact()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;项目中实现了 &lt;code&gt;AutoTimesColliderTrigger&lt;/code&gt;（进出范围自动控制触发锁）&lt;/li&gt;
&lt;li&gt;Interactable 实现了持续性交互（长按）、掉落物拾取、宝箱开启等多种类型&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5.2 分支对话系统&lt;a href=&quot;#52-分支对话系统&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DialogueDataSO&lt;/code&gt; 存储对话数据，&lt;code&gt;DialogueSegment&lt;/code&gt; 包含对话内容与分支选项 &lt;code&gt;BranchOption&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BranchOption&lt;/code&gt; 定义分支进入条件、目标对话、是否可选（&lt;code&gt;ButtonText&lt;/code&gt; 非空则显示选项按钮）&lt;/li&gt;
&lt;li&gt;对话中通过 &lt;code&gt;QuestAction&lt;/code&gt; 标志触发任务的接取/完成&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ConversationManager&lt;/code&gt; 管理对话的开启/推进/结束与分支选择&lt;/li&gt;
&lt;li&gt;文字显示采用策略模式，支持打字机效果（&lt;code&gt;TypewriterStrategy&lt;/code&gt;）与即时显示（&lt;code&gt;InstantStrategy&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;六、背包系统&lt;a href=&quot;#六背包系统&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ItemSO&lt;/code&gt; 配置物品数据：名称、图标、类型、最大堆叠数量、使用效果等&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ItemSlot&lt;/code&gt; 为背包槽位，持有 &lt;code&gt;ItemSO&lt;/code&gt; 与数量&lt;/li&gt;
&lt;li&gt;&lt;code&gt;InventoryManager&lt;/code&gt; 管理 &lt;code&gt;ItemSlot&lt;/code&gt; 列表，提供增删改查 API，通过 &lt;code&gt;EventCenter&lt;/code&gt; 广播物品变动事件（增减、使用），实现 UI 与数据的松耦合&lt;/li&gt;
&lt;li&gt;宝箱、掉落物通过 &lt;code&gt;DropEntry&lt;/code&gt; 配置掉落表，静态工厂方法生成 &lt;code&gt;ItemPickup&lt;/code&gt;，拾取时调用 &lt;code&gt;InventoryManager&lt;/code&gt; 完成物品添加&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;七、JSON 存档系统&lt;a href=&quot;#七json-存档系统&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;存档系统通过 &lt;code&gt;SaveManager&lt;/code&gt; 统一调度，覆盖两类数据：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;管理器数据&lt;/strong&gt;（任务、背包等）：各管理器自行实现 &lt;code&gt;Save/Load&lt;/code&gt; 方法，由 &lt;code&gt;SaveManager&lt;/code&gt; 统一调用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;场景对象&lt;/strong&gt;（怪物、宝箱、门、掉落物等）：继承 &lt;code&gt;ISaveable&lt;/code&gt; 接口，实现 &lt;code&gt;CaptureState()&lt;/code&gt; / &lt;code&gt;RestoreState()&lt;/code&gt;。数据包括：是否死亡/开启/拾取、血量、位置等。SaveManager 通过 &lt;code&gt;FindObjectsOfType&lt;/code&gt; 收集场景中所有 ISaveable 并序列化为 JSON&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;技术要点总结&lt;a href=&quot;#技术要点总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;












































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;设计模式/技术&lt;/th&gt;&lt;th&gt;应用场景&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;管线模式&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;InputPipeLine → MainProcessorPipeLine → ArbiterPipeLine 三级流水线&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;黑板模式&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;RuntimeData 作为全局数据共享中心&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;状态模式 + 模板方法&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;有限状态机 + sealed LogicUpdate + 打断器机制&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;策略模式&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;DamageSO 伤害策略、ITextDisplayStrategy 文字显示策略&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;外观模式&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;IAnimationFacade 抽象动画系统&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;观察者模式&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;EventCenter 事件总线驱动任务、UI、背包等模块通信&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;对象池&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;IPoolable 接口，支持角色复用的对象池系统&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;ScriptableObject 配置&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;所有静态数据通过 SO 配置，实现数据与逻辑分离&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;构造器注入&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;所有依赖通过构造函数传递，无 Service Locator，便于测试&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;技术栈&lt;/strong&gt;：Unity 2022.3 · URP · C# · Unity Input System · Cinemachine 2.x · TextMeshPro&lt;/p&gt;&lt;/section&gt;</content:encoded></item></channel></rss>