Skip to content

手把手教程:从零搭建一个恐怖生存世界

我们要做一个恐怖生存游戏,灵感来自**「不,我不是人类」**。设定很简单:末日降临,外面有伪装成人类的「访客」。你独自在家,每晚都有人来敲门。透过猫眼判断对方是人还是怪物,做出选择,活过 14 个夜晚。

完成这篇教程后,你就掌握了 Yumina 的核心创作技能 —— 条目、变量、指令、组件和知识库。以后无论你想做什么类型的世界,都从这里开始 (•̀ᴗ•́)و


第一步:创建新世界

点击左侧导航栏的 创建 按钮,然后选择 空白项目。在编辑器的顶部输入框中填写世界名称:

  • 名称The Imposters

如果你还不熟悉编辑器的各个模块,先阅读 运作方式 再回来继续。


第二步:编写角色设定条目

点击左侧导航栏的 知识库

让我们创建自己的条目。确保你在 预设 分组下,然后点击右上角的 添加条目

在这个游戏中,AI 不是扮演某个角色 —— 而是充当游戏主持人(GM),负责叙述场景、扮演所有 NPC、推动故事发展。所以第一个条目要告诉 AI 它的角色和职责。

创建角色设定条目

字段
名称游戏主持人设定
发送方式指令(AI 会将其视为必须遵守的规则)
标签点击 预设

内容 字段中写入:

你是一个公平公正的恐怖生存游戏主持人(GM)。游戏持续 14 天(14 个夜晚)。

设定:末日已经降临。城市被「访客」占据 —— 它们看起来和人类一模一样。玩家独自在家。每晚都有人来敲门求助。玩家必须透过猫眼观察、隔着门对话,用各种方法判断来访者是人类还是怪物,再决定是否开门。

你的职责:
- 每晚描述敲门者的外貌和行为
- 公平地给出线索,但不要直接揭示其身份
- 白天让玩家自由探索公寓、使用道具、打电话
- 维持悬疑而紧张的氛围
- 每次回复结尾给出 3–5 个建议选项(用 A/B/C/D/E 格式)

每次回复以阶段标题开头:
- 夜晚:🌑 **第 X 夜**
- 白天:☀️ **第 X 天**

几个要点:

  • 这个条目在 预设 下 → 它始终发送给 AI,每次对话都可见。核心设定必须放在这里
  • 发送方式 = 指令 → AI 会将其视为系统指令,而不是角色对话
  • 标签 = 预设 → 用于分类组织

第三步:编写开场白

切换到 开场白 模块,点击 添加问候语。(也可以在 知识库 中创建一个 role: greeting 的条目 —— 效果相同。)

编辑第一条消息

🌑 **第 1 夜**

电视屏幕上满是雪花噪点。一段紧急广播用机械的声音不断重复着同样的警告:「……目前已确认的访客特征:牙齿异常整齐、如瓷器般洁白。请居民保持警惕,切勿为陌生人开门……」

你独自待在公寓里。这是个不大的地方 —— 浴室、客厅、卧室、书房、厨房,还有一间储物间。前门上有一个猫眼。储物间里有一把手枪。书房里有一部座机电话。冰箱里还有几天的食物。

窗外,街道空无一人。至少 —— 看起来是这样。

然后,敲门声响起。

***咚……咚……咚。***

一个年轻女人的声音透过门传来,颤抖着、带着哭腔:「求求你……让我进去……外面有东西在追我……」

**建议选项:**
A. 开门让她进来
B. 隔着门和她说话,问几个问题
C. 拒绝,让她离开
D. 透过猫眼仔细观察她
E. 其他(输入你想采取的任何行动)

好的开场白有这些关键要素:

  1. 立刻告诉玩家自己在哪、发生了什么
  2. 明确列出可用的资源和环境
  3. 以一个决策结尾,迫使玩家立即行动

第四步:创建游戏变量

切换到 变量 模块,点击 添加变量。创建 5 个变量。

创建变量

1. 生命值

字段
IDplayer_hp
显示名称Player HP
类型Number
默认值3
最小值0
最大值5
行为规则玩家被访客攻击或犯下致命错误时减 1。若玩家放苍白陌生人进门、或承认自己独自在家,直接归零。归零即游戏结束。

2. 体力

字段
IDenergy_current
显示名称Energy
类型Number
默认值3
最小值0
最大值8
行为规则搜身访客和开枪各消耗 1 点。猫眼观察和对话免费。白天恢复到上限。体力为 0 时无法执行消耗体力的行动。

3. 天数

字段
IDgame_day
显示名称Game Day
类型Number
默认值1
最小值1
最大值14
行为规则每完成一个昼夜循环加 1。第 14 天结束时游戏收尾。

4. 阶段

字段
IDgame_phase
显示名称Game Phase
类型String
默认值Night
行为规则取值为「Night」或「Day」。夜晚处理敲门事件,白天自由探索房间、使用道具。

5. 持枪状态

字段
IDplayer_has_gun
显示名称Has Gun
类型Boolean
默认值True
行为规则玩家初始持有一把手枪。开枪射击访客消耗 1 点体力,但可能误伤人类。开枪后描写其后果。

什么是行为规则?

行为规则 不是代码 —— 它是用自然语言写给 AI 看的指令。AI 生成回复时会读取这些规则,从而知道什么时候该更新哪个变量。把它当作 AI 的「小抄」就好了 φ(>ω<*)


第五步:变量是怎么变化的

你可能在想 —— 变量设好了,AI 怎么知道什么时候该改它们?

好消息:你不需要手动教 AI。 只要你的世界有变量,Yumina 引擎会自动做两件事:

  1. 自动告诉 AI 指令格式:引擎每轮会悄悄给 AI 塞一组指令,告诉它使用 [variableID: operation value] 的语法来更新状态。你不需要做任何事情。
  2. 自动把你的行为规则发给 AI:你在第四步中给每个变量写的规则,每轮都会被 AI 看到。AI 根据这些规则决定什么时候更新什么。

举个例子:在 health 变量的行为规则中,你写了「被访客攻击或做出危险选择时减少」。当游戏中玩家被攻击时,AI 会在回复末尾写上 [health: -20]。引擎检测到这个指令后,会自动把生命值从 100 扣到 80。

所以,行为规则写得越清楚,AI 表现就越好。 回去检查一下你在第四步中写的规则,确保每个变量都清楚地说明了「什么时候变、怎么变」。

指令在 AI 输出中长什么样?

在 AI 回复的末尾,你会看到类似这样的内容:

[health: -20]
[energy: -15]

这些就是指令。引擎会自动提取并应用它们,玩家看到的回复中不会出现这些内容。

更多指令语法

除了 +(加)和 -(减),还有 set(设定为某个值)、toggle(翻转布尔值)等。详见 → AI 指令与宏


第六步:让它好看 —— AI 生成界面

到这里你的世界已经可以玩了。但玩家看到的全是纯文本 —— 没有氛围感,没有沉浸感。让我们做一个真正有恐怖游戏感觉的界面。

「写代码?」不用 —— 让 AI 来 ( ̄▽ ̄)ノ

方法一:使用 Yumina 内置的 Studio AI(推荐)

  1. 点击编辑器顶部的 进入工作室
  2. 打开 AI 助手 面板
  3. 发送以下内容(可以直接复制):
把根组件(index.tsx)重写为一个末日恐怖生存风格的 UI。
参考《不,我不是人类》的风格。
外层保持 `<Chat renderBubble={(msg) => ...} />` —— 让平台继续负责
输入框、流式光标和滑动切换;我们只接管气泡样式。

我需要这些效果:

1. 阶段标题:
   - 如果 AI 回复中包含「🌑 **第 X 夜**」,提取它并渲染成 CRT 显示器风格的标题栏
     (暗绿色发光文字,扫描线效果,轻微闪烁)
   - 如果包含「☀️ **第 X 天**」,渲染成暖色调标题栏(琥珀色文字)
   - 把标题从消息正文中移除 —— 单独显示

2. 敲门效果:
   - 如果回复中包含 ***三个星号包裹的加粗斜体文字***,提取它并渲染成
     敲门动画 —— 红色大字配抖动效果

3. 底部 HUD 状态栏:
   - 等宽字体,暗绿色背景
   - 显示:⚡ 体力(energy_current 变量)、❤️ 生命(player_hp 变量)、
     🔫/🚫 持枪状态(player_has_gun 变量)
   - 紧凑的单行显示

4. 叙事文本区:
   - 暗色背景(深绿黑),边缘有微妙的辉光
   - 浅绿色文字,行距宽松便于阅读
   - 用 renderMarkdown 渲染

5. 选项按钮:
   - 如果 AI 回复中包含「建议选项:」或「**你的选择:**」,提取选项
     (A. B. C. D. E.)并渲染成可点击的按钮
   - 点击后自动发送对应选项
   - 暗绿色调,悬停时更亮

6. 整体氛围:黑绿色 CRT 显示器美学,低饱和度,压抑的末日感

我的变量:
- player_hp —— 生命,number,0–5
- energy_current —— 体力,number,0–8
- game_day —— 当前天数,number,1–14
- game_phase —— "Night" 或 "Day"
- player_has_gun —— 是否持枪,true/false
  1. AI 会生成代码并显示审批卡片;画布面板提供实时预览
  2. 满意?点击 批准。想修改?继续聊 ——「把敲门效果做得更震撼一些」或者「选项按钮太分散了」

Studio AI 生成界面

生成效果预览

就这样 —— 一个酷炫的前端,轻松搞定!

方法二:使用外部 AI(Claude、ChatGPT 等)

如果你更习惯用其他 AI,也完全可以。把上面的效果描述连同下面的 Yumina 技术信息一起发送:

Yumina 技术说明(写代码时请遵守这些规则):
- 根组件:导出 `export default function MyWorld() { return <Chat renderBubble={(msg) => ...} /> }`
- `<Chat />` 是平台提供的聊天构件 —— 它负责输入框、消息
  列表、流式光标;我们只通过 renderBubble 自定义每个气泡
- 在 renderBubble 内部,msg 对象提供:`contentHtml`(预渲染的 HTML)、`rawContent`
  (原始文本)、`role`("user" / "assistant")、`messageIndex`、`isStreaming`、
  `renderMarkdown(text)`(把 markdown 转成格式化的 HTML)
- useYumina() 提供变量,例如 useYumina().variables.player_hp
- useYumina().sendMessage(text) 以玩家身份发送消息(用于可点击选项)
- 内置 Icons 库(无需 import),例如 Icons.Heart、Icons.Zap
- 支持 Tailwind CSS 和 React hooks
- 用 useEffect + document.createElement("style") 注入动画
- React、Chat、useYumina、Icons 在沙箱中均为全局可用 —— 无需 import

拿到代码后:

  1. 回到编辑器 → 自定义 UI 模块 → 打开 index.tsx
  2. 粘贴代码(替换默认的 return <Chat />
  3. 如果底部显示 编译:OK,就搞定了

你不需要看懂代码

你不需要理解代码在做什么。只要粘贴后底部显示 编译:OK,就说明它在正常工作。如果有报错,把错误信息原封不动地发给 AI,让它修复 ∠( ᐛ 」∠)_

效果不满意怎么办?

直接告诉 AI:「血条太细了,加粗一倍」「背景改成纯黑」「加个闪烁效果」。迭代几轮就能达到你想要的样子。


第七步:编写知识库条目

之前的条目在 预设 分组里 —— 始终发送。但有些信息只需要在相关时才可用 —— 这就是 聊天历史 分组的用途。

回到 知识库,展开左侧的 聊天历史 分组,在该分组下点击 添加条目,创建几个关键词触发的条目:

1. 敲门规则

字段
名称敲门事件
发送方式指令
关键词敲门开门
敲门事件规则:
- 每晚有 2–3 名访客,逐个出现
- 玩家选项:透过猫眼观察(免费)、隔门对话(免费)、要求搜身(消耗体力)、开门或拒绝
- 放人类进来 = 可能提供帮助 | 放访客进来 = 危险
- 描写敲门场景时保持悬疑 —— 绝不直接揭示身份

2. 猫眼观察

字段
名称猫眼观察
发送方式指令
关键词猫眼偷看观察
猫眼观察规则:
- 只能看到来访者的头部和上半身
- 描写重点:面部表情、牙齿、眼睛、皮肤纹理
- 访客的伪装有细微破绽(牙齿异常整齐、瞳孔异常、皮肤纹理诡异)
- 人类有正常的瑕疵(蛀牙、黑眼圈、疤痕)
- 绝不直接揭示身份 —— 只描写所见

3. 房间搜索

字段
名称房间搜索
发送方式指令
关键词搜索查看翻找探索房间
房间搜索规则(仅限白天):
- 储物间:可以找到手枪
- 厨房:食物补给,可恢复少量体力
- 书房:电话,可打电话获取信息
- 描写环境细节,营造不安感

关键词触发是怎么工作的?

在每次 AI 回复之前,引擎会扫描最近的消息。如果出现匹配的关键词 → 对应的条目会被临时发送给 AI。如果没人提到 → AI 看不到它,不浪费 token 预算。高效又精准 (≧▽≦)

扫描深度是 知识库条目设置 下的 扫描深度 设置 —— 默认 2,建议调到 4。


第八步:测试

核心内容已经完成了。来测试一下!

点击编辑器顶部的 保存,然后点击左侧导航栏底部的金色 试玩 按钮。编辑器会直接把你带进会话里 —— 如果之前已有这个世界的存档会自动复用,没有的话会自动新建一个。检查以下几项:

检查项如何验证如果不正常
开场白出现进入后自动显示第一条消息检查 开场白 模块是否有写好的问候语
自定义 UI 生效消息有 CRT 风格的阶段标题和 HUD检查 index.tsx 是否有 renderBubble 代码且 编译 状态为 OK
指令正常工作交互后变量发生变化(HUD 数值更新)检查每个变量的行为规则是否写清楚了
知识库触发提到「猫眼」后 AI 遵循相关规则检查关键词拼写和 扫描深度 设置

第九步:填写概览信息

测试通过后,切换到 概览,填写发布前的信息:

  1. 上传一张封面图片(能传达恐怖氛围的图)
  2. 写一段简介,让玩家知道他们要玩什么
  3. 添加标签恐怖生存悬疑互动小说
  4. 设置语言:选择你的世界所用的语言(例如 中文
  5. 点击顶部的 保存

概览信息


第十步:发布

  1. 在编辑器顶栏点击 发布 按钮(紧挨着 保存
  2. 在发布对话框里设置内容分级一般向敏感内容)、可见性和是否允许他人编辑
  3. 勾选条款协议并点击发布

搞定!你的世界上线啦 ヽ(✿゚▽゚)ノ


你学到了什么

概念你做了什么
条目(Entries)编写了系统设定和开场白 —— AI 行为的基础
变量(Variables)创建了 HP、体力和天数计数器 —— 游戏状态的骨架
指令(Directives)引擎自动教 AI;你只需要写清楚行为规则
自定义 UI让 AI 生成状态面板 —— 自己不用写代码
知识库(Lorebook)关键词触发的规则条目 —— 按需调用的知识库

这五个部分协同工作,就构成了一个完整的交互世界。

还能做什么

本教程只用了最基础的功能。Yumina 还能做很多:

  • 规则引擎 —— HP 归零时自动触发死亡结局,不需要依赖 AI 记忆
  • 自定义 UI 指南 —— 把消息变成对话气泡、视觉小说场景或战斗日志
  • 音频 —— 添加 BGM 和音效,进入地下室时自动切换诡异音乐
  • 条件条目 —— 根据变量值激活条目,比如后期剧情揭示

想深入了解各个系统,规则引擎自定义 UI变量 的参考页面有包含复杂状态管理的实例。


前往 yumina.io 搜索**「No, I'm not a Human」**体验完整版 —— 感受一下你的世界可以变成什么样。然后回来继续创作 ᕕ( ᐛ )ᕗ