跳转至

包内更新器

Aesir Architecture 内置面向 unitypackage 安装方式的包内更新器:无需重新下载导入,编辑器内一键完成版本检测与更新。

管辖范围

更新器只管辖 Assets/Runestone/ 下的代码导入副本(unitypackage 安装)。Git URL(UPM)安装的副本不在管辖内——纯 UPM 安装形态下该菜单经 validate 整体隐藏,不显示误导入口;Package Manager 也不会对 Git URL 包显示更新提示,升级 = 移除旧包后用同一 Git URL 重新添加(latest 分支名永久固定,无需随发版修改)。开发仓库(存在 .git)切勿点更新 —— Release 内容会覆盖本地源码(窗口已内置警告)。

使用

菜单 Tools → Aesir → Check for Updates 打开更新窗口:

  1. 扫描 Assets/Runestone/*/package.json 识别本地安装的 Aesir 包与版本
  2. 检测最新 Release 版本
  3. 点击更新,自动完成全流程(无需手动干预)

更新入口:单包更新与全部更新

  • 行内「更新」按钮 —— 包列表每行一个,仅更新该包;只使用其中一个包的项目按需更新。另一已知包在场且落后于远程版本时,确认框前置「配套版本警告」(两包按同版本配套发布,仅更新其一可能导致 API 不匹配),提示但不阻止
  • 「全部更新」按钮 —— 语义为"补全 + 更新":目标 = 过期包 + 缺失的已知包补装。只装了其中一个包的项目点「全部更新」会把缺失的包一并装上,确认框逐包标注「更新 / 新安装」并前置缺包说明

更新流程

检测新版本 → 下载 unitypackage → 静默导入 → 差集清理残留 → 登记安装清单
步骤 行为
下载 从 GitHub Release 拉取 <包目录名>-v<版本>.unitypackage
导入 AssetDatabase.ImportPackage 静默导入
残留清理 导入成功后按「上次安装清单 − 新版清单」精确差集删除(仅限本包目录内;无历史清单则跳过,不误伤用户新增文件;导入失败时旧文件原封不动)
清单登记 逐包合并登记 .aesir/installed-manifest.json;更新中途域重载时,已导入包的状态保证正确落盘

回滚方式:上一版本 unitypackage 永久保留在 GitHub Releases,下载对应版本重新导入即可完整还原;本地修改会被 Release 内容覆盖,确认框中已明示。

版本检测:直连优先的三层兜底(大陆友好)

版本检测按以下顺序尝试,首个成功即返回 —— 能直连 GitHub 就是 100% 最新:

层 源(顺序即尝试顺序) 特性
① 直连 GitHub Releases API → releases/latest 的 302 探测 → 仓库内 .github/update-info.json 的直连 raw 发布即刻可见、无缓存延迟;API 未认证 60 次/时/IP,302 探测与 raw 完全绕开 API 限流
② 镜像站 ghproxy.net / gh-proxy.com(代理 raw 内容) 直连不可用时的实时兜底
③ CDN 中转 jsDelivr 四域名(cdn / testingcf / gcore / fastly) 分支缓存最长约 12 小时,故排在最后

直连可用时绝不会落到后两层。只有 tag 的检测结果(API / 302)会按同 tag 校验补齐文件清单 —— 拒绝陈旧清单,避免差集清理误删文件。

超时与进度条

环节 上限
单源检测 5 秒(不可达即落下一层)
整轮检测 30 秒(超时后不再发起新请求,「检测详情」会留痕「跳过:整轮检测已超时」)
unitypackage 下载 总时长 120 秒 + 连续 30 秒无进展(双判据)

UnityWebRequest.timeout 只覆盖「完全无数据」的情形,服务端慢速滴水时不会触发,因此上述环节一律叠加墙钟判据;任一超时都会中止请求并抛出明确异常,窗口的进度条必定收起。

界面上的线路信息

检测完成后窗口会显示:

  • 连接状态 —— 「GitHub 直连:可用 —— 版本信息 100% 实时」或「不可用 —— 已通过兜底线路获取,结果可能不是最新」
  • 获取线路 —— 最终结果是经直连 / 镜像站 / CDN 中转哪一条拿到的
  • 检测详情(各层尝试) —— 逐条列出每层成功或失败与耗时,便于定位网络问题
  • 延迟提示 —— 仅当结果来自 CDN 中转时提示可能存在数小时延迟,可点「打开 Releases 页面」人工确认

连续更新多个包

两包同号发版、Modules 依赖 Architecture,所以更新总是按依赖顺序逐包执行。导入 unitypackage 会带来脚本变更,流程期间会锁定程序集重载,避免中途域重载打断第二个包的更新(表现为进度条停留、按钮提前可点);导入瞬间会先收起本工具进度条,让位给 Unity 自带的导入进度条。

下载:逐线路兜底与可取消

unitypackage 下载与版本检测一样逐线路兜底:GitHub Release 直链 → 镜像站代理(ghproxy.net / gh-proxy.com 前缀 + 完整 Release 地址),单线路失败自动落下一线路,全部失败时异常附「打开 Releases 页面手动下载、双击导入」的自助指引(jsDelivr 不代理 Release 资产,故 CDN 不参与下载)。

下载阶段的进度条可随时点「取消」中止:取消后温和收尾,如实区分「已完成导入的包(保持有效)」与「未更新的包」;更新期间请保持 Unity 窗口处于前台(编辑器失焦时下载与导入可能停滞)。

设计参考

实现参考 QFramework PackageKit(版本记录随包走),增强点为精确差集清理(清理时机为导入成功之后,非 PackageKit 的先删后导)。

继续阅读

  • 快速开始 —— 三种安装方式对比
  • FAQ —— 更新器常见问题