2877 字
14 分钟

My ARPG 开发日志:重构与移动端适配

项目仓库: Gitee | GitHub

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

2026-03-18:项目初始化#

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

2026-03-19~20:场景切换与项目整理#

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

2026-03-21~23:商店调试与场景重构#

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

2026-03-24~25:存档系统与掉落持久化#

存档管理器实现保存和读取,保存玩家位置、物品数据,完善背包管理器跨场景物品保存。掉落物拾取状态在场景切换时保持记忆,丢弃的物品会被清理。提交初始 A* 寻路代码。

2026-03-28~31:A* 寻路#

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

寻路按三层解耦组织:网格数据层从 Tilemap 和静态碰撞体自动构建节点地图,负责可步行/障碍标记和世界坐标↔网格坐标转换;寻路算法层做标准 A* 搜索,支持 8 方向移动和对角线通行检查;路径消费层挂在移动对象上,按节点推进并内置重寻路机制——目标移动超过阈值时自动重建路径,新旧路径比较后决定是否替换,配合冷却计时器防止频繁重算。

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

2026-04-01~04:NPC 与动画#

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

2026-04-05~06:NPC 状态机与对话#

NPC 状态管理完成。对话管理器和对话数据资产进一步完善。

2026-04-07~08:菜单场景与异步加载#

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

2026-04-10:重试与 Bug 修复#

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

2026-04-14~15:对话选项与条件对话#

加入对话选项 UI 和逻辑,完善对话数据资产。对话管理器支持选项分支,场景目录重整到游戏场景目录下。重构寻路算法、移动控制器、NPC 巡逻等脚本。

通过可脚本化对象实现条件对话和分支控制。新增对话历史、物品历史、访问历史管理器记录状态。

2026-04-17:场景淡入调试#

修复按钮场景切换器和场景切换器中的场景切换淡入问题。

2026-04-19:对话历史与条件对话#

重构对话历史管理脚本,加入唯一标识数据资产用于标识对话、任务等对象。新增第二个 NPC,完善对话数据资产结构。对话选项分支、物品条件检测、拒绝条件对话完成,对话管理器和 NPC 对话交互完善条件对话逻辑。

条件对话的规则:对话开始前检查前置条件——角色是否对话过、物品是否拾取够数量,条件不满足时展示拒绝对话;一次性触发标记实现一次性对话。

2026-04-20~21:任务系统框架#

创建任务数据资产、地点数据资产、任务日志槽等脚本和预制体,实现任务日志 UI 框架。新增任务日志界面和任务管理器,完善任务数据结构。新增任务目标槽、任务奖励槽和经验物品数据资产。任务系统大体完成,支持多个任务点,用事件系统解耦加载变更。

2026-04-22~24:任务完善#

加入任务系统并优化体验——打开后直接定位到第一个未完成任务。支持多个任务点,事件系统解耦加载变更。新增任务板和任务板预制体。新增多个任务(拾取并对话、购物、默认任务),完善任务管理器逻辑。任务操作按钮(接受/拒绝/完成)通过事件系统解耦任务交互。

新增第二个游戏场景,重试按钮修复。任务接受/拒绝/完成通过任务操作事件驱动。任务板、任务日志界面和任务管理器进一步优化。

2026-04-26:掉落事件与任务奖励#

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

任务状态按状态机推进:未接受 → 已接受 → 可完成 → 已完成,带拒绝分支可回退到已接受。目标类型支持物品拾取数量检查和角色对话检查,目标达成后自动推进状态;完成任务通过事件系统发放奖励到背包。

2026-04-28:商店重构与 UI 整合#

使用事件通信重构商店系统,修复跨场景商店 NPC 头像渲染的 bug。整合所有画布组到 UI 管理器统一管理,改用事件订阅模式,移除各自每帧更新中的输入检测。任务日志槽新增状态重置,已完成任务在打开任务板时自动标记完成态。

2026-05-01:集成菜单#

实装集成菜单。新增输入状态管理,通过配置数据资产、状态机逻辑结合枚举,使集成菜单和其它面板互斥。

2026-05-03:退出按钮与移动端适配#

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

2026-05-04:条件对话重构#

重构条件对话方案,拒绝对话数据继承基础对话数据资产,依赖管理更自然,不依赖枚举匹配。取消运行时”已对话”布尔变量,收回到历史管理器内记录。

2026-05-05:背包系统#

加入背包系统(卡了一些 bug),加入拖拽脚本。背包支持物品使用、出售和丢弃,与商店共用同一条库存更新链路。

2026-05-06~08:UI 与商店重构#

重构 UI 管理器和商店 NPC。一些重构加上存档画布组和系统默认存档、新加载存档的逻辑。

2026-05-09:存档系统完成#

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

存档按注册表模式组织:所有可持久化对象实现统一存/读接口,激活时自动注册到存档管理器;场景切换时统一调用所有已注册对象的存/读方法。序列化和文件 I/O 单独成层,支持手动存档与自动系统档分离——自动存档在场景切换时触发,手动存档由玩家操作触发。删除前校验路径不超出数据目录,加载时自动跳过损坏存档并回退到最近的完整档。

2026-06~07:文档与资源维护#

一段维护期:修正拼写、更新 README,并为美术资源补上借物表标注来源。期间发现部分精灵图资源连同 meta 文件被误删,从远端仓库按原 GUID 恢复,避免场景和预制体的引用断链。

2026-08-08~09:代码重构冲刺#

两天二十多次提交的重构。事件系统统一替换为公共事件字段,调用方直接订阅;单例模式改为通过抽象基类统一实现,初始化流程有了统一约束;序列化字段统一收为私有并加标注;拆分 UI 管理器职责;“聚焦”语义从打开事件中剥离,不再复用同一条切换事件;重试机制改为全局配置自动匹配加载,通用场景切换按钮不再依赖场景内匹配发信。

切断了玩家相关代码的三角形依赖:挥砍、射击、击退的起始响应改用事件解耦,不再依赖 Inspector 里拖拽的引用。期间修复了切换角色后速度未重置的问题,还排查出一个由隐式脚本挂接寻找依赖引起的 bug。同步整理脚本目录命名,删除示例资源,恢复被误删的 UI 字体并保持 GUID 一致。

2026-08-09~15:移动端适配与安卓实机#

相机正交尺寸随屏幕自适应,解决异形屏画面拉伸;加像素对齐,第二次修复相机模糊;击退数值异常修复。移动端输入:五月初那版摇杆效果不佳,这轮重新适配了虚拟摇杆,新增移动端攻击按键,修复集成面板的 ESC 响应。

安卓构建完成:处理构建工具的网络代理问题,写了代理配置脚本和一份安卓构建指南,APK 发送到实体机运行验证。8 月 15 日收尾——同步项目内开发日志,调整场景与字体资产,删除不必要的文件。下一步计划借助 Addressables 引入 xLua,在这个项目里学习 Lua 语法和热更新。


项目介绍:My ARPG

My ARPG 开发日志:重构与移动端适配
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