1620 字
8 分钟
My ARPG 开发日志:场景切换、A*、对话与任务系统

项目仓库: Gitee | GitHub

开发记录覆盖场景切换、状态恢复、A* 寻路、NPC 状态、条件对话、任务系统、商店、UI 路由、集成菜单和存档系统。代码围绕事件通信、ScriptableObject 数据和多场景结构组织,每个模块单独建类,数据依赖沿同一条主链传递。

318:项目初始化#

工程已有玩家状态机、击退处理、商店入口和部分目录结构。加入挥砍射击动作及动画、敌人攻击动作及动画、瓦片地图、SO 通信系统、商店/技能树/状态栏 UI。重构玩家移动脚本中的状态机逻辑,分离状态枚举,加入击退状态 HandleKnockBackState。新建 TimeManager 管理暂停/恢复逻辑,ShopKeeperShopManager 迁移商店购买逻辑。

319~320:场景切换与项目整理#

SceneChangerGameManager 实现场景切换功能,Addressables 异步加载,加入 ConfinerFinder 处理相机边界。解决 UTF-8 BOM 编码问题,整理项目文件结构,脚本目录重整到 Assets/Scripts 下,加入字体资源和许可证。

321~323:商店调试与场景重构#

调试场景切换和商店相关 bug。五次提交重写场景切换逻辑,精简 PersistentSceneScene1 场景数据。

324~325:存档系统与 Loot 持久化#

DataManager 实现 Save()/Load(),保存和读取玩家位置、物品数据,完善 InventoryManager 跨场景物品保存。Loot 拾取状态在场景切换时保持记忆,丢弃的物品会被清理。提交初始 A* 寻路代码。

328~331:A* 寻路#

基础 A* 寻路完成。难点在于框架搭建和寻路逻辑处理——遍历最优路径、按父节点导出寻路链。扩展 A* 后做了三点优化:偏移带对角障碍的路径点并比对新旧路径、选取离起始点更近的头节点防止倒着走、加上朝向玩家的方向向量防止 flip 导致的鬼畜。两格及以上位置不再卡脚,扫描静态 Collider2D 加入 A* 地图作为 obstacle。

遗留问题:跨场景保存物品数量未处理好,A* 无法通过部分一格窄通道(拐角处),疑似与优化相关。

401~404:NPC 与动画#

加入岩石、玩家动画资源,PurplePawn NPC 预制体和相关脚本框架。完善 PurplePawn 动画控制器,实现 NPC 随机游荡逻辑,开始实现 NPC 对话系统并完善对话功能。

405~406:NPC 状态机与对话#

NPC 状态管理完成。对话管理器和 DialogSO 脚本进一步完善。

407~408:菜单场景与异步加载#

创建 Menu 场景,按钮点击事件切换到游戏场景 1。跨场景自动初始化 Canvas。异步加载时先卸载场景并禁用移动,加载完成后再允许移动,防止玩家移动触发 teleport 干扰异步逻辑。问题:加载时打开 Canvas 会导致场景加载出错,建议用 InputSystem 全局禁用输入解决。

410:Retry 与 Bug 修复#

修复了换场景血量直接刷满、Retry 逻辑错误导致乱加载场景的问题。RetryButton 功能完成。

414~415:对话选项与条件对话#

加入对话选项 UI 和逻辑,完善 DialogSODialogManager 支持选项分支,场景目录重整到 GameScene 目录下。重构 AStarPathFinderMovementControllerNPCPatrol 等脚本。

通过可脚本化对象实现条件对话和分支控制。新增 ConversationHistoryManagerItemHistoryManagerVisitedHistoryManager 管理对话历史。

417:场景淡入调试#

修复 ButtonSceneTogglerSceneChanger 中的场景切换淡入问题。

419:对话历史与条件对话#

重构对话历史管理脚本,加入 GuidSO 用于唯一标识。新增 YellowPawn NPC(第二个 NPC),完善对话 SO 数据结构。对话选项分支、物品条件检测、拒绝条件对话完成,DialogManagerNPCChat 完善条件对话逻辑。

420~421:任务系统框架#

创建 QuestSOLocationSOQuestLogSlot 等脚本和预制体,实现任务日志 UI 框架。新增 QuestLogUIQuestManager,完善 QuestSO 数据结构。新增 QuestObjectiveSlotQuestRewardsSlot、EXP 物品 SO。任务系统大体完成,支持多个任务点,用事件系统解耦加载变更。

422~424:任务完善#

加入任务系统并优化体验——打开后直接定位到第一个未完成任务。支持多个任务点,事件系统解耦加载变更。新增 QuestBoardManagerQuestBoard 预制体。新增多个任务(PickAndChatShoppingDefaultQuest),完善 QuestManager 逻辑。QuestOptionsButton(任务接受/拒绝/完成按钮)通过事件系统解耦任务交互。

新增 Scene2 场景,Retry 按钮修复。任务接受/拒绝/完成通过 QuestOptionsEventSO 事件驱动。任务板(QuestBoardQuestLogUIQuestManager 进一步优化。

426:Loot 事件与任务奖励#

重构 loot 脚本事件系统,新增 LootEventSOLoot 脚本通过事件系统与 InventoryManager 通信。任务奖励实装——现在可以真正获得任务奖励(包括经验),ExpManager 完善。优化任务完成提示和任务条目刷新逻辑。修复 Retry 后会卡住的 bug,修复角色切换时攻击会卡住动画的 bug。

428:商店重构与 UIManager 整合#

使用事件通信重构商店系统,修复 ShopPortraitCameraController 处理跨场景商店 NPC 头像渲染的 bug。整合所有画布组到 UIManager 统一管理,改用事件订阅模式,移除各自 Update 中的 Input 检测。QuestLogSlot 新增状态重置,已完成任务在打开 board 时自动标记完成态。

501:集成菜单#

实装集成菜单。新增 UIInputState 输入状态类,通过配置 SO、状态机逻辑结合枚举类,使集成菜单和其它面板互斥。

503:退出按钮与移动端适配#

增加每个菜单界面的”X”退出按钮。新增 WebGL、移动端构建时的摇杆画布组,效果不佳。

504:条件对话重构#

重构条件对话方案,创建依赖 DialogSORefuseDialogSO 子类,依赖管理更自然,不依赖枚举匹配。取消运行时 hasChated 布尔变量,收回到 HistoryManager 内记录。

505:背包系统#

加入背包系统(卡了一些 bug),加入拖拽脚本。

506~508:UIManager 与 ShopKeeper 重构#

重构 UIManagerShopKeeper。一些重构加上 Save&Load 存档画布组和系统默认存档、新加载存档的逻辑。

509:存档系统完成#

存档系统完成——打通了 UI 和逻辑层。补充开发日志并整理文档。根据游戏指南和当前工程状态撰写 README,同步整理项目入口、操作说明和存档说明。


项目介绍:My ARPG

My ARPG 开发日志:场景切换、A*、对话与任务系统
https://www.yonagi.world/posts/unity-arpg-dev-log/
作者
YONAGI
发布于
2026-06-02
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

封面
遠い日に想いを馳せて
Laplacian
封面
遠い日に想いを馳せて
Laplacian
0:00 / 0:00