新建扩展

进入 个性化 → 项目设置。在左侧扩展树顶部点击「新建扩展」,填写名称、作者和描述。 新建窗口底部的「安装位置」由父目录 + 扩展目录名组成,并实时显示最终路径。默认父目录是「文稿/AVG-Extensions」,也可以改到自己的代码仓库。 创建完成后,扩展默认只有:
my-extension/
├── extension.json
├── .gitignore
└── ui/
这是一个可以直接工作的纯界面扩展。它没有 src/package.jsondist/,也不需要安装依赖。

先制作一份界面

展开扩展下的「界面」分组,点击新增按钮并输入显示名称。Studio 会创建界面文档并打开可视化编辑器。 你可以放置文字、图片、按钮、设置控件和存档格子,配置变量、点击动作与动画。完成后:
  • 由另一份可视化界面的点击动作打开;
  • 在「游戏系统」中绑定为标题、存档、设置等系统界面;
  • 或继续初始化程序,为界面补充自定义逻辑。
编辑器完整说明见可视化界面编辑器

按需初始化程序

选择扩展下的「程序」。尚未初始化时,Studio 会展示两条路径:继续用可视化界面,或初始化程序。 点击初始化后会补充:
my-extension/
├── extension.json
├── package.json
├── tsconfig.json
├── vite.config.ts
├── README.md
├── sdk/
├── src/
│   ├── index.tsx
│   └── welcome-ui.tsx
└── dist/
    └── index.js
extension.json 也会加入 entry,表示这个扩展包含需要加载的程序。

安装与构建

在扩展目录运行:
npm install
npm run build
持续开发时使用:
npm run watch
Vite 会在源码变化后重新生成 dist/index.js,Studio 检测到变化后刷新程序预览。
当前脚手架没有 npm run dev 命令。监听构建请使用 npm run watch

在 Studio 中构建

v1.9.0 新增
本地程序扩展可以在扩展树中右键选择「构建扩展(自动装依赖)」。Studio 会:
  1. 按扩展的锁文件选择包管理器;
  2. 同步依赖;已经安装时会快速完成;
  3. 执行构建脚本;
  4. 刷新项目发行物和程序预览。
首次同步依赖可能需要几分钟。构建进度和失败信息会显示在任务提示中;需要持续监听源码变化时,仍使用终端运行 npm run watch

扩展日志

选择扩展树中的程序模块后,程序预览下方会显示这份扩展自己的日志。扩展代码中的 console.logconsole.infoconsole.warnconsole.errorconsole.debug 会实时出现在这里,不会和其他扩展的输出混在一起。 日志面板支持按级别筛选、复制单条日志和清空内容。开发界面、剧本方法或其他运行逻辑时,可以直接在 Studio 里查看执行结果和错误信息,不必先打开浏览器开发者工具。

编写程序模块

程序入口是 src/index.tsx。扩展类继承 Extension,按需声明界面、方法、设置和存档:
import { Extension, extension, method } from "@avg-studio/sdk";

@extension({ id: "my-tools", label: "我的工具" })
export class MyTools extends Extension {
  static greet = method({
    title: "打招呼",
    schema: {
      name: { type: "string", label: "名字", required: true },
    },
    run(ctx, params) {
      ctx.variables.set("lastGreeting", `你好,${params.name}`);
    },
  });
}
接下来可以阅读:

导入已有扩展

扩展树顶部的「导入扩展」支持:
  • 选择扩展文件夹;
  • 选择 .zip 压缩包;
  • 把文件夹或 .zip 拖到扩展树区域。
导入内容会复制成一份可编辑的本地扩展,原文件夹或压缩包不受影响。压缩包多套一层目录时会自动寻找真正的扩展根,__MACOSX.DS_Store 等系统文件会被忽略。 同 id 的本地扩展会先询问是否覆盖;内置 avg.internal.* 扩展不能被覆盖。解压后的总体积上限为 300MB。
当前导入流程会校验 extension.json 和程序入口:如果清单没有显式 entry,会按 dist/index.js 检查。只有可视化 UI、没有程序产物的压缩包目前会被拒绝;在 Studio 内新建的纯界面扩展不受影响。

三种来源

来源是否可编辑管理方式
系统否;系统界面可创建项目副本不能停用或卸载
本地可重新定位、停用或删除
市场可按项目启用、停用或卸载
扩展启用状态跟随项目。同一台电脑上,A 项目启用并不会让 B 项目自动启用。 本地扩展可以在扩展树中右键选择「重命名」。重命名只修改面向创作者显示的名称,不改变稳定扩展 id、目录名、项目依赖或剧本引用;系统和工坊扩展不能重命名。 界面和程序较多时,可以分别折叠扩展树中的「界面」与「程序」分组。折叠只影响 Studio 当前显示,不会停用模块或改变构建结果。

移除与彻底删除

本地扩展提供两种不同的管理操作:
操作本机源码当前项目发行物适用情况
从 Studio 移除保留保留可运行快照暂时解除工作区关联,稍后可能重新定位或导入
彻底删除移到系统废纸篓删除确认不再需要源码和项目依赖
彻底删除还会清理当前项目对该扩展的依赖关系。操作前先提交源码或制作备份;只想解决路径变更时,使用「重新定位」而不是删除。 市场扩展使用卸载流程;系统扩展不能移除或彻底删除。

项目发行物

扩展被项目启用后,Studio 会把运行所需的清单、界面和程序构建产物保存到项目内,形成一份项目发行物。预览和构建游戏时会使用这份发行物。 项目发行物会随项目目录一起复制和分享,但不会包含 src/ 等扩展源码。这样,其他创作者即使没有安装原扩展,也可以正常打开、预览和构建项目;只有继续修改扩展代码时才需要本机源码。

工程被移动后

Studio 记录本地扩展路径。文件夹被移动、改名或删除后,扩展会显示「路径不存在」。 源码仍在时,右键扩展选择「重新定位」,指向新目录即可。新目录中的 extension.json id 必须和原扩展一致。

打包

可视化界面文档会随启用的扩展一起打包。带程序的扩展还需要存在有效的 dist/index.js;打包只包含运行所需的界面、清单和构建产物,不包含 src/ 源码。