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

项目仓库: Gitee | GitHub 在线试玩:ARPG WebGL Demo

My ARPG 基于 Unity 2022.3.62f3c1。原型围绕场景切换、状态恢复、条件对话、任务推进、商店交互和 UI 管理展开。资源加载使用 Addressables,输入使用 Input System,模块通信使用 ScriptableObject 事件。

对象#

工程对象分成场景层、状态层、导航层和交互层。场景层由 InitialLoadSceneChangerSceneLoadEventSOGameSceneSO 组成,负责持久场景和地图切换。状态层由 DataManagerISaveableDataDefinitionData 组成,用于对象注册、数据分发和持久化标识。导航层由 AStarPathFinderAStarNodeManagerPathFinderDetails 组成,底层结构使用 Dictionary<Vector3, PathFinderDetails>HashSet<Vector3>。交互层覆盖 NPCStateControllerNPCWanderNPCPatrolNPCChatShopKeeperDialogSODialogLineDialogOptionQuestSOQuestObjectiveRewardQuestProgressDataShopManagerUIManager

职责#

SceneChanger 负责场景卸载、场景加载、玩家坐标切换和输入恢复,DataManager 负责 Save()Load()ISaveable 注册表,AStarPathFinder 负责 FindPath()WorldToCell()CellToWorld()GetNodeMap()AStarNodeManager 负责导航节点生成。

交互层的职责按模块拆开。NPCStateController 维护 IdleWanderPatrolChat 状态流,NPCChat 把交互请求交给 DialogManagerShopKeeper 把商店请求交给 ShopManagerDialogManager 负责 MatchConditionsToStartDialog()、分支选择和 DialogSO.HasChatedQuestManagerDictionary<QuestSO, QuestProgressData>Dictionary<QuestObjective, int> 维护任务状态,UIManager 负责 ToggleCanvasEventSOResetCanvas() 和面板互斥。

流程#

场景流程从 SceneLoadEventSO 进入 SceneChanger.OnEnable(),再走 LoadSceneMode.AdditiveOnLoadCompleted()。传送门、菜单、碰撞脚本只发切换请求,坐标写入 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()DialogSODialogOption。角色条件依赖 ConversationHistoryManagerHashSet<CharacterSO>,物品条件依赖 ItemHistoryManagerDictionary<ItemSO, int>,一次性条件依赖 DialogSO.HasChated。任务流程由 QuestManager.UpdateObjectiveProgress() 直接读取历史数据,奖励流程由 RaiseRewardEvent() 写入 InventorySlotsStatsSO。商店流程从 ShopLoadEventSO 进入 ShopManager.OnShopLoad()PopulateShopItems(),购买与出售都经过 InventoryUpdateRequest.RaiseInventoryUpdateRequest()。UI 流程由输入检测、ToggleCanvasEventSOCanvasGroup 组成,切场景时执行 ResetCanvas()

边界#

场景切换 SceneChanger,外层对象只保留请求入口。运行时的状态保存: DataManagerISaveable,对象侧只处理序列化字段。寻路系统: AStarPathFinderAStarNodeManager,NPC、敌人、交互物共享导航数据,不持有网格生成逻辑。

交互边界按系统拆开。NPC 本体不持有对话 UI、商店 UI、任务 UI。DialogManager 依赖历史数据,不依赖移动逻辑。QuestManager 依赖历史系统,不维护对话状态。UIManager 只处理面板开关,不处理任务、商店、对话数据。

限制#

当前版本覆盖场景切换、对象状态恢复、条件对话、任务统计、商店和面板互斥。完整落盘存档、敌人状态持久化、地图交互对象、背包规则和任务内容仍在补全。


配套开发日志:My ARPG 开发日志

My ARPG:场景切换、对话、任务和 UI 管理的 Unity 2D ARPG 原型
https://www.yonagi.world/posts/unity-arpg-project-intro/
作者
YONAGI
发布于
2026-04-29
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

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