My ARPG:场景切换、对话、任务和 UI 管理的 Unity 2D ARPG 原型

作者:YONAGI

项目仓库&博客地址: 基于 Unity 。原型围绕场景切换、状态恢复、条件对话、任务推进、商店交互和 UI 管理展开。资源加载使用 Addressables,输入使用 Input System,模块通信使用 ScriptableObject 事件。 对象 工程对象分成场景层、状态层、导航层和交互层。场景层由 、 、 、 组成,负责持久场景和地图切换。状态层由 、 、 、 组成,用于对象注册、数据分发和持久化标识。导航层由 、 、 组成,底层结构使用 和 。交互层覆盖 、 、 、 、 、 、 、 、 、 、 、 、 、 。 职责 负责场景卸载、场景加载、玩家坐标切换和输入恢复, 负责 、 和 注…

项目仓库&博客地址: Gitee https://gitee.com/KAIDOYONAGI/my arpg GitHub https://github.com/KAIDO YONAGI/My ARPG Yonagi's World 一个简洁的个人站点 https://www.yonagi.world/ My ARPG 基于 Unity 2022.3.62f3c1 。原型围绕场景切换、状态恢复、条件对话、任务推进、商店交互和 UI 管理展开。资源加载使用 Addressables,输入使用 Input System,模块通信使用 ScriptableObject 事件。 对象 工程对象分成场景层、状态层、导航层和交互层。场景层由 InitialLoad 、 SceneChanger 、 SceneLoadEventSO 、 GameSceneSO 组成,负责持久场景和地图切换。状态层由 DataManager 、 ISaveable 、 DataDefinition 、 Data 组成,用于对象注册、数据分发和持久化标识。导航层由 AStarPathFinder 、 AStarNodeManager 、 PathFinderDetails 组成,底层结构使用 Dictionary<Vector3, PathFinderDetails 和 HashSet<Vector3 。交互层覆盖 NPCStateController 、 NPCWander 、 NPCPatrol 、 NPCChat 、 ShopKeeper 、 DialogSO 、 DialogLine 、 DialogOption 、 QuestSO 、 QuestObjective 、 Reward 、 QuestProgressData 、 ShopManager 、 UIManager 。 职责 SceneChanger 负责场景卸载、场景加载、玩家坐标切换和输入恢复, DataManager 负责 Save 、 Load 和 ISaveable 注册表, AStarPathFinder 负责 FindPath 、 WorldToCell 、 CellToWorld 、 GetNodeMap , AStarNodeManager 负责导航节点生成。 交互层的职责按模块拆开。 NPCStateController 维护 Idle 、 Wander 、 Patrol 、 Chat 状态流, NPCChat 把交互请求交给 DialogManager , ShopKeeper 把商店请求交给 ShopManager 。 DialogManager 负责 MatchConditionsToStartDialog 、分支选择和 DialogSO.HasChated , QuestManager 用 Dictionary<QuestSO, QuestProgressData 和 Dictionary<QuestObjective, int 维护任务状态, UIManager 负责 ToggleCanvasEventSO 、 ResetCanvas 和面板互斥。 流程 场景流程从 SceneLoadEventSO 进入 SceneChanger.OnEnable ,再走 LoadSceneMode.Additive 和 OnLoadCompleted 。传送门、菜单、碰撞脚本只发切换请求,坐标写入 newPosition ,缺失时回退到 GameSceneSO.initialPosition 。 存档流程从 VoidEventSO 进入 DataManager.Save 和 DataManager.Load 。 DataManager 带 DefaultExecutionOrder 100 ,先建立 List<ISaveable ,再把 Data 分发给对象。对象侧通过 SaveData Data data 和 LoadData Data data 读写字段, DataDefinition.ID 用于对象定位, Data.lootsStatsDic 用于战利品状态恢复。 寻路流程从 FindPath 开始,经过 SearchCheapestCost 、 AddNodeToOpen 、 CanWalkDiagonally 完成搜索。 optPos 用于前移起点, NoCoverObstacleNodes 用于检查直线路径,对角移动受相邻阻挡检测约束。 对话流程从 NPCChat 进入 DialogManager ,再进入 MatchConditionsToStartDialog 、 DialogSO 和 DialogOption 。角色条件依赖 ConversationHistoryManager 的 HashSet<CharacterSO ,物品条件依赖 ItemHistoryManager 的 Dictionary<ItemSO, int ,一次性条件依赖 DialogSO.HasChated 。任务流程由 QuestManager.UpdateObjectiveProgress 直接读取历史数据,奖励流程由 RaiseRewardEvent 写入 InventorySlotsStatsSO 。商店流程从 ShopLoadEventSO 进入 ShopManager.OnShopLoad 和 PopulateShopItems ,购买与出售都经过 InventoryUpdateRequest.RaiseInventoryUpdateRequest 。UI 流程由输入检测、 ToggleCanvasEventSO 和 CanvasGroup 组成,切场景时执行 ResetCanvas 。 边界 场景边界收在 SceneChanger ,外层对象只保留请求入口。状态边界收在 DataManager 和 ISaveable ,对象侧只处理序列化字段。导航边界收在 AStarPathFinder 和 AStarNodeManager ,NPC、敌人、交互物共享导航数据,不持有网格生成逻辑。 交互边界按系统拆开。NPC 本体不持有对话 UI、商店 UI、任务 UI; DialogManager 依赖历史数据,不依赖移动逻辑; QuestManager 依赖历史系统,不维护对话状态; UIManager 只处理面板开关,不处理任务、商店、对话数据。 限制 当前版本覆盖场景切换、对象状态恢复、条件对话、任务统计、商店和面板互斥。完整落盘存档、敌人状态持久化、地图交互对象、背包规则和任务内容仍在补全。