本技能面向在 Pixi'VN 项目中使用 ink 叙事语言的开发场景,覆盖从安装配置到调试、翻译生成和核心写作差异的入门内容。
用途 当任务涉及 .ink 文件或 @drincs/pixi-vn-ink 包时使用:设置 Vite 插件、排查 ink 修改未生效或标签命令未触发、生成翻译文件,以及编写或审阅普通 ink 叙事结构(knots、diverts、choices、weave、变量、列表)。
安装 安装命令为:npm install @drincs/pixi-vn @drincs/pixi-vn-ink。 对等依赖:@drincs/pixi-vn(>=1.9.0)和 zod(>=4.4.0,用于 HashtagCommands/TextReplaces 校验)。vite 为可选对等依赖,仅在使用下述 Vite 插件时需要,官方建议所有真实项目都采用该插件。
Vite 插件 从 @drincs/pixi-vn-ink/vite 导入 vitePluginInk,在 vite 配置中注册,示例配置使用 inkGlob、inkJsonOutputPattern、inkJsonManifestPath 三个选项:inkGlob 指定要跟踪的 .ink 文件(glob,从 Vite root 解析),插件会生成虚拟模块 virtual:pixi-vn-ink,导出匹配文件的原始文本;inkJsonOutputPattern 设置后,每个匹配的 .ink 文件会经 convertInkToJson 编译并写到指定路径(支持 [name]、[ext]、[extname]、[file]、[path]、[dir] 占位符),游戏加载预编译 JSON 而非在浏览器中运行 ink 编译器;inkJsonManifestPath 指定生成的 manifest.json(列出每个导出 JSON 的 URL,用于批量加载)的写入位置,省略时默认写到输出目录下的 manifest.json。
入口接线 在应用入口调用一次 setupInkHmrListener()(来自 @drincs/pixi-vn-ink/vite-listener)。它会导入初始编译 JSON,并在 Vite 开发服务器连接时订阅 ink-updated HMR 事件,使 .ink 修改无需整页刷新即可热重载;生产构建中同样的调用也适用。底层原语 importInkText 和 importJson 仍可直接使用,但仅建议在 Vite 插件流程之外(如无头脚本或运行时加载远程 ink)使用。
VS Code 安装 ink 扩展,推荐 settings.json 设置 ink.mainFile、ink.rootFolder、ink.markup 和 ink.engine(pixi-vn 模式)。
调试 运行 vite/npm run dev 时,终端会以 (pixi-vn-ink) 前缀输出 ink 编译错误/警告、未知标签命令、标签键结构和未知跳转目标等信息,并给出每个导出的汇总。开发服务器提供三个只读端点:/__pixi-vn-ink/hashtag-commands、/__pixi-vn-ink/text-replaces、/__pixi-vn-ink/info,可查询已注册命令、文本替换处理器和版本信息。编辑 .ink 后可打开生成的 JSON,对照源码确认行为是否符合预期。
翻译文件生成 通过 onInkTranslate 接入翻译,使用 generateJsonInkTranslation 针对每个编译后的 ink JSON 生成翻译文件骨架,遍历 labels/steps 收集对话字符串并添加 defaultValue 条目,可重复调用。
在 Pixi'VN 中写 ink knot 即 Pixi'VN 标签,-> knot 是 jump,-> knot -> 是 call,->-> 和 -> DONE 都可结束 call;ink 与 JS/TS 标签在同一注册表中,可互相跳转/调用。divert 默认在下一步执行,紧贴文本无换行则同步执行。原生 ink 的 Threads(<-)在 Pixi'VN 中仅等同于 tunnel。VAR/CONST 对应常规 storage,temp 对应临时 storage,变量名即存储键,可与 JS/TS 的 storage.get/set 互通;LIST 条目必须使用限定名(如 items.sword),裸短名会静默解析为无关的普通存储键。=== function ... === 在运行时被静默忽略,建议改用标签命令或 StepLabelProps 暴露的 JS 函数。CHOICE_COUNT、TURNS、TURNS_SINCE、SEED_RANDOM 以及多数 LIST_*() 函数尚未实现;RANDOM、POW、INT/FLOOR/FLOAT 和基础 LIST 操作可用。INCLUDE 被忽略,应使用 inkGlob 或 importInkText([...]) 加载多个文件;任何 knot 之外的顶层叙述(包括顶层 -> start)均被忽略,knot 只能由 JS/TS 显式启动。此外,shuffle 多行会合并为一个对话块,一次性选项在 weave 中的失效规则与原生 ink 不同,需要显式使用 {!shove} 实现同等效果。
适用场景与限制 适合 Pixi'VN + ink 项目的安装配置、调试、翻译生成和核心写作指导。未提供关于收费、价格、平台支持或效果承诺的信息;上述未实现功能以官方文档“Upcoming features”为准,资料中未提供完整更新清单。