对话与旁白
本页属于 GenPy Ren'Py 学习路线。教程内容面向 Ren'Py 8.x,并在页面末尾连接到 GenPy 的对应工作流。
学习目标
- 了解“对话与旁白”在 Ren'Py 项目中的用途。
- 能在一个最小项目里验证本章相关语法或工作流。
- 知道发布前需要检查的常见风险,并能在 GenPy 中继续维护。
核心语法
Charactersay statementnarrationextendvoice_tag
可运行示例
text
define e = Character("艾琳", color="#c8ffc8")
define m = Character("我", color="#88ccff")
define narrator = Character(None) # 旁白(默认就有)教程正文
对话是视觉小说的主体。Ren'Py 用 say 语句 表达,用 Character 定义说话者。
1. say 语句
text
"这是一句旁白(没有名字框)。"
e "这是角色 e 说的台词。"
"旁白者" "也可以临时用字符串当名字。"- 一行一句。
- 前置一个角色变量或字符串=说话者;只有字符串=旁白。
- 引号内同类引号要转义:
e "他说\"你好\"。"
2. 定义角色 Character
用 define 在加载期定义角色对象:
text
define e = Character("艾琳", color="#c8ffc8")
define m = Character("我", color="#88ccff")
define narrator = Character(None) # 旁白(默认就有)常用参数:
| 参数 | 作用 |
|---|---|
color | 名字颜色 |
image | 关联立绘标签(配合 say with attributes) |
what_prefix / what_suffix | 给台词加前后缀(如自动加引号) |
who_prefix / who_suffix | 给名字加前后缀 |
kind=nvl | 该角色用 NVL 全屏文本模式(见 21 章) |
callback | 对话回调(语音、特效) |
ctc | click-to-continue 图标 |
voice_tag | 语音标签,便于按角色静音配音 |
window_background | 该角色专属对话框背景 |
给台词自动加引号
text
define e = Character("艾琳", what_prefix='“', what_suffix='”')
label start:
e "你好。" # 显示为:“你好。”3. 文本插值与样式
台词里可嵌入变量与文本标签:
text
$ name = "玩家"
e "你好,[name]!" # 变量插值
e "这是{b}重点{/b}。" # 文本标签(见第 10 章)
e "价格是 [[100]] 元。" # 显示字面量 [ 用 [[4. say 携带图像属性(强烈推荐)
如果角色用 image 关联了立绘标签,台词前可直接写属性,自动切换表情:
text
define e = Character("艾琳", image="eileen")
image eileen happy = "eileen_happy.png"
image eileen sad = "eileen_sad.png"
label start:
show eileen happy
e happy "我很开心!" # 等价于 show eileen happy 再说话
e sad "现在有点难过。" # 自动切到 sad 表情临时属性 @
@ 后的属性只在这一句生效,说完恢复:
text
e happy "我一直很开心,"
e @ surprised "但突然被吓了一跳!" # 仅此句 surprised
e "……然后又恢复开心。" # 回到 happy@ 与 = 组合可同时设临时与持久属性:e happy @ wink "..."。
5. extend(接续上一句)
extend 在同一对话框里把文字追加到上一句之后,常做停顿/渐显效果:
text
e "我在想……"
e "{w=0.5}" extend " 也许我们该出发了。"6. 单行临时角色
不想专门 define 时,可用字符串直接当名字:
text
"神秘人" "我们又见面了。"或用 Character 即时构造:$ temp = Character("路人")。
7. 关键字参数微调单句
say 语句可临时覆盖角色设置:
text
e "正常台词。"
e "这句更靠中间。" (what_xalign=0.5)8. NVL 模式(全屏文本)速记
text
define n = Character("旁白", kind=nvl)
label start:
n "第一段,会累积在屏幕上。"
n "第二段,叠加显示。"
nvl clear # 清屏,开始新一页详见第 21 章。
常见坑
- 旁白与对话的区别只在于有没有前置说话者。
define(不变)vsdefault(可变存档量)别混;角色对象通常用define。- 想显示字面
[/{,要写[[/{{。 - 用
image=+ say attributes 能让“说话即换表情”,比手动show简洁得多。
官方参考
- 对话与旁白:https://www.renpy.org/doc/html/dialogue.html
- Character 详解:https://www.renpy.org/doc/html/dialogue.html#defining-character-objects
在 GenPy 里怎么做
- 在 GenPy 的代码模式中维护相关 .rpy 文件,先保持语法清晰,再逐步加入本章功能。
- 用故事图谱、变量、校验或演出编辑器把“能运行”提升到“可维护”。
- 导出前结合 Ren'Py Lint 和 GenPy 校验结果,确认脚本、素材和发布路径一致。
推荐继续阅读:
