手把手教程:从零搭建一个恐怖生存世界
我们要做一个恐怖生存游戏,灵感来自**「不,我不是人类」**。设定很简单:末日降临,外面有伪装成人类的「访客」。你独自在家,每晚都有人来敲门。透过猫眼判断对方是人还是怪物,做出选择,活过 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. 其他(输入你想采取的任何行动)好的开场白有这些关键要素:
- 立刻告诉玩家自己在哪、发生了什么
- 明确列出可用的资源和环境
- 以一个决策结尾,迫使玩家立即行动
第四步:创建游戏变量
切换到 变量 模块,点击 添加变量。创建 5 个变量。

1. 生命值
| 字段 | 值 |
|---|---|
| ID | player_hp |
| 显示名称 | Player HP |
| 类型 | Number |
| 默认值 | 3 |
| 最小值 | 0 |
| 最大值 | 5 |
| 行为规则 | 玩家被访客攻击或犯下致命错误时减 1。若玩家放苍白陌生人进门、或承认自己独自在家,直接归零。归零即游戏结束。 |
2. 体力
| 字段 | 值 |
|---|---|
| ID | energy_current |
| 显示名称 | Energy |
| 类型 | Number |
| 默认值 | 3 |
| 最小值 | 0 |
| 最大值 | 8 |
| 行为规则 | 搜身访客和开枪各消耗 1 点。猫眼观察和对话免费。白天恢复到上限。体力为 0 时无法执行消耗体力的行动。 |
3. 天数
| 字段 | 值 |
|---|---|
| ID | game_day |
| 显示名称 | Game Day |
| 类型 | Number |
| 默认值 | 1 |
| 最小值 | 1 |
| 最大值 | 14 |
| 行为规则 | 每完成一个昼夜循环加 1。第 14 天结束时游戏收尾。 |
4. 阶段
| 字段 | 值 |
|---|---|
| ID | game_phase |
| 显示名称 | Game Phase |
| 类型 | String |
| 默认值 | Night |
| 行为规则 | 取值为「Night」或「Day」。夜晚处理敲门事件,白天自由探索房间、使用道具。 |
5. 持枪状态
| 字段 | 值 |
|---|---|
| ID | player_has_gun |
| 显示名称 | Has Gun |
| 类型 | Boolean |
| 默认值 | True |
| 行为规则 | 玩家初始持有一把手枪。开枪射击访客消耗 1 点体力,但可能误伤人类。开枪后描写其后果。 |
什么是行为规则?
行为规则 不是代码 —— 它是用自然语言写给 AI 看的指令。AI 生成回复时会读取这些规则,从而知道什么时候该更新哪个变量。把它当作 AI 的「小抄」就好了 φ(>ω<*)
第五步:变量是怎么变化的
你可能在想 —— 变量设好了,AI 怎么知道什么时候该改它们?
好消息:你不需要手动教 AI。 只要你的世界有变量,Yumina 引擎会自动做两件事:
- 自动告诉 AI 指令格式:引擎每轮会悄悄给 AI 塞一组指令,告诉它使用
[variableID: operation value]的语法来更新状态。你不需要做任何事情。 - 自动把你的行为规则发给 AI:你在第四步中给每个变量写的规则,每轮都会被 AI 看到。AI 根据这些规则决定什么时候更新什么。
举个例子:在 health 变量的行为规则中,你写了「被访客攻击或做出危险选择时减少」。当游戏中玩家被攻击时,AI 会在回复末尾写上 [health: -20]。引擎检测到这个指令后,会自动把生命值从 100 扣到 80。
所以,行为规则写得越清楚,AI 表现就越好。 回去检查一下你在第四步中写的规则,确保每个变量都清楚地说明了「什么时候变、怎么变」。
指令在 AI 输出中长什么样?
在 AI 回复的末尾,你会看到类似这样的内容:
[health: -20]
[energy: -15]这些就是指令。引擎会自动提取并应用它们,玩家看到的回复中不会出现这些内容。
更多指令语法
除了 +(加)和 -(减),还有 set(设定为某个值)、toggle(翻转布尔值)等。详见 → AI 指令与宏
第六步:让它好看 —— AI 生成界面
到这里你的世界已经可以玩了。但玩家看到的全是纯文本 —— 没有氛围感,没有沉浸感。让我们做一个真正有恐怖游戏感觉的界面。
「写代码?」不用 —— 让 AI 来 ( ̄▽ ̄)ノ
方法一:使用 Yumina 内置的 Studio AI(推荐)
- 点击编辑器顶部的 进入工作室
- 打开 AI 助手 面板
- 发送以下内容(可以直接复制):
把根组件(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- 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拿到代码后:
- 回到编辑器 → 自定义 UI 模块 → 打开
index.tsx - 粘贴代码(替换默认的
return <Chat />) - 如果底部显示 编译:OK,就搞定了
你不需要看懂代码
你不需要理解代码在做什么。只要粘贴后底部显示 编译:OK,就说明它在正常工作。如果有报错,把错误信息原封不动地发给 AI,让它修复 ∠( ᐛ 」∠)_
效果不满意怎么办?
直接告诉 AI:「血条太细了,加粗一倍」「背景改成纯黑」「加个闪烁效果」。迭代几轮就能达到你想要的样子。
第七步:编写知识库条目
之前的条目在 预设 分组里 —— 始终发送。但有些信息只需要在相关时才可用 —— 这就是 聊天历史 分组的用途。
回到 知识库,展开左侧的 聊天历史 分组,在该分组下点击 添加条目,创建几个关键词触发的条目:
1. 敲门规则
| 字段 | 值 |
|---|---|
| 名称 | 敲门事件 |
| 发送方式 | 指令 |
| 关键词 | 门、敲门、开门、敲 |
敲门事件规则:
- 每晚有 2–3 名访客,逐个出现
- 玩家选项:透过猫眼观察(免费)、隔门对话(免费)、要求搜身(消耗体力)、开门或拒绝
- 放人类进来 = 可能提供帮助 | 放访客进来 = 危险
- 描写敲门场景时保持悬疑 —— 绝不直接揭示身份2. 猫眼观察
| 字段 | 值 |
|---|---|
| 名称 | 猫眼观察 |
| 发送方式 | 指令 |
| 关键词 | 猫眼、偷看、观察、看 |
猫眼观察规则:
- 只能看到来访者的头部和上半身
- 描写重点:面部表情、牙齿、眼睛、皮肤纹理
- 访客的伪装有细微破绽(牙齿异常整齐、瞳孔异常、皮肤纹理诡异)
- 人类有正常的瑕疵(蛀牙、黑眼圈、疤痕)
- 绝不直接揭示身份 —— 只描写所见3. 房间搜索
| 字段 | 值 |
|---|---|
| 名称 | 房间搜索 |
| 发送方式 | 指令 |
| 关键词 | 搜索、查看、翻找、探索、房间 |
房间搜索规则(仅限白天):
- 储物间:可以找到手枪
- 厨房:食物补给,可恢复少量体力
- 书房:电话,可打电话获取信息
- 描写环境细节,营造不安感关键词触发是怎么工作的?
在每次 AI 回复之前,引擎会扫描最近的消息。如果出现匹配的关键词 → 对应的条目会被临时发送给 AI。如果没人提到 → AI 看不到它,不浪费 token 预算。高效又精准 (≧▽≦)
扫描深度是 知识库 中 条目设置 下的 扫描深度 设置 —— 默认 2,建议调到 4。
第八步:测试
核心内容已经完成了。来测试一下!
点击编辑器顶部的 保存,然后点击左侧导航栏底部的金色 试玩 按钮。编辑器会直接把你带进会话里 —— 如果之前已有这个世界的存档会自动复用,没有的话会自动新建一个。检查以下几项:
| 检查项 | 如何验证 | 如果不正常 |
|---|---|---|
| 开场白出现 | 进入后自动显示第一条消息 | 检查 开场白 模块是否有写好的问候语 |
| 自定义 UI 生效 | 消息有 CRT 风格的阶段标题和 HUD | 检查 index.tsx 是否有 renderBubble 代码且 编译 状态为 OK |
| 指令正常工作 | 交互后变量发生变化(HUD 数值更新) | 检查每个变量的行为规则是否写清楚了 |
| 知识库触发 | 提到「猫眼」后 AI 遵循相关规则 | 检查关键词拼写和 扫描深度 设置 |
第九步:填写概览信息
测试通过后,切换到 概览,填写发布前的信息:
- 上传一张封面图片(能传达恐怖氛围的图)
- 写一段简介,让玩家知道他们要玩什么
- 添加标签:
恐怖、生存、悬疑、互动小说 - 设置语言:选择你的世界所用的语言(例如
中文) - 点击顶部的 保存

第十步:发布
- 在编辑器顶栏点击 发布 按钮(紧挨着 保存)
- 在发布对话框里设置内容分级(一般向或敏感内容)、可见性和是否允许他人编辑
- 勾选条款协议并点击发布
搞定!你的世界上线啦 ヽ(✿゚▽゚)ノ
你学到了什么
| 概念 | 你做了什么 |
|---|---|
| 条目(Entries) | 编写了系统设定和开场白 —— AI 行为的基础 |
| 变量(Variables) | 创建了 HP、体力和天数计数器 —— 游戏状态的骨架 |
| 指令(Directives) | 引擎自动教 AI;你只需要写清楚行为规则 |
| 自定义 UI | 让 AI 生成状态面板 —— 自己不用写代码 |
| 知识库(Lorebook) | 关键词触发的规则条目 —— 按需调用的知识库 |
这五个部分协同工作,就构成了一个完整的交互世界。
还能做什么
本教程只用了最基础的功能。Yumina 还能做很多:
- 规则引擎 —— HP 归零时自动触发死亡结局,不需要依赖 AI 记忆
- 自定义 UI 指南 —— 把消息变成对话气泡、视觉小说场景或战斗日志
- 音频 —— 添加 BGM 和音效,进入地下室时自动切换诡异音乐
- 条件条目 —— 根据变量值激活条目,比如后期剧情揭示
想深入了解各个系统,规则引擎、自定义 UI 和 变量 的参考页面有包含复杂状态管理的实例。
前往 yumina.io 搜索**「No, I'm not a Human」**体验完整版 —— 感受一下你的世界可以变成什么样。然后回来继续创作 ᕕ( ᐛ )ᕗ
