项目仓库: Gitee | GitHub 在线试玩:ARPG WebGL Demo
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 只处理面板开关,不处理任务、商店、对话数据。
限制
当前版本覆盖场景切换、对象状态恢复、条件对话、任务统计、商店和面板互斥。完整落盘存档、敌人状态持久化、地图交互对象、背包规则和任务内容仍在补全。
部分信息可能已经过时
粤公网安备44011102484817号