Zoharwolf's blog
  • 主页
  • Godot优缺点笔记
  • 剧本命令参考
由 GitBook 提供支持
在本页
  • 前置说明
  • 基本命令
  • 对话
  • 命令执行条件 cond:
  • 流程控制
  • 跳转 @jump
  • 结束剧本 @end
  • 选择支 @sel @selstart
  • 切换地图和地图层 @map @layer
  • 显示标题画面 @title
  • 演出控制
  • 等待@wait @w
  • 音频 @bgm @xbgm @bgmv @bgs @xbgs @se @xse
  • 移动和改变位置与朝向 @move @movejump @pos @dir
  • 动画@anime
  • 显示表情@emo
  • npc控制 @npccmd
  • 画面控制
  • 黑屏白屏单色屏 @solid
  • 闪屏 @flash
  • 图片遮罩 @frame
  • 显示CG @cg @scg @scgdec @xcg
  • 聚焦效果 @focus
  • 震屏 @shake
  • 相机控制 @cam
  • 缘相关 @yuan @yuanwait @ywait
  • 设置相关
  • 切换主角 @player
  • 设置字符串 @str
  • 名字遮罩 @namemask
  • 系统
  • 显示变量值 @print

这有帮助吗?

剧本命令参考

前置说明

一切命令的实现入口都写在StoryTeller和StoryNpc两个类里,没有细分更多的类。

剧本都是.txt类型,统一放在Assets/Story/目录下,可以建二级文件夹。

命令分为以下几种类型:

  • 注释,以#开头

  • 对话,格式是:角色名+冒号+空格+方括号+中文版默认文本,比如: rice: [talkid01]说话的具体内容。

  • 剧本头,以-开头。虽然不是硬性要求,但最好把它们放在剧本的最开始,现在是用来控制每个npc的出现或消失的条件,格式是 -NPC名:出现条件 比如: -npc_dog:$meat_cnt>3 (之后也可以追加其他的宏观控制功能

  • 标签,以*开头,跳转用的功能,很重要,请多使用。注意在一个剧本txt文件内不能使用同名的标签。

  • 剧本命令,以@开头,剧本的大部分控制命令都属于这一类。

  • 变量操作,以$开头,加一个带等号的算式。比如: $score=$score+5

写对话时,可以不写方括号[]中具体的talkId,只写一个方括号即可。然后执行菜单 Mytool->AddTextId 扫描所有剧本并根据标签名自动添加talkId。

把一个对象的tag设成pos,并且默认是active的状态,就会被认为是一个pos对象。为了能保证一直是active状态,推荐把pos放在GameMapLayer之外。

把StoryNpc组件添加到一个对象上,此对象就会被认为是npc,名字默认是它的对象名,也可以指定Npc Sp Name来为它改名(建议在重对象重名的情况下使用,平时不推荐用)。

npc、主角、pos是等同的,在命令里指定一个pos名时,除了会去找pos对象,也会去找npc和主角。主角的名固定是player。

命令中的数值属性,除了可以直接写数值,基本都支持写变量。比如 @pos player x=5 或者 @pos player x=$player_x 。另外也支持pos名属性的写法,比如: @pos player x=player_pos.x

很多命令都有一个wait属性,默认都是true。表示会自动等此条命令执行完毕,才继续执行后面的。如果不想等,可以写wait=false

把剧本文件拖到StoryNpc的Story参数中,把对应的标签名写在Run Tag参数中(不用写*号),把NPC的Trigger Type选成Check或Enter,当剧本头里写的条件满足时,就相应从剧本的对应标签行开始执行,直到遇到@end为止

基本命令

对话

有几种写法

  • 角色名_立绘差分名: [对话翻译id]中文版默认文本 。 角色名需要参考\Assets\Resources\translation\ 下的翻译文本中的talkerName,必须在这里有配置,才能正常显示。立绘差分名对应Assets\Resources\image\face\ 目录下的立绘文件名。如果不写_立绘差分名,就不显示立绘。

  • x: [对话翻译id]中文版默认文本。 旁白文本,不显示姓名。

  • bub_npc名: [对话翻译id]中文版默认文本。 弹对话框气泡,不需要写名,但要写出是弹在哪个npc的对象头上。如果需要同时弹多个气泡,可以写bub2_npc名或bub3_npc名,这个会随bub_npc的气泡一同消失。如果希望气泡自动消失而不是点击消失,可以直接修改变量$bubble_t1 $bubble_t2 $bubble_t3,当它们大于0时就会使气泡变成自动消失。

对话中的特别指令用法:

  • 在对话中加入单引号''的文本会被高亮。

  • 想在对话中换行,需要手动写一个\n而不能真的换行。

  • 直接写$变量名+空格,可以显示变量的值。

一些例子:

tri: [dialog_test10]三宝说一句话,但不显示立绘。
tri_simple: [dialog_test20]三宝显示立绘lh_tri_simple.png,并且说一句话。
x: [dialog_test30]旁白说一句话。

bub_player: [dialog_test40]主角头上冒一个气泡对白。\n然后这是气泡第二行。

bub2_npcdog: [dialog_test50]npcdog在下面主角冒气泡的同时,头上也冒一个气泡。
bub_player: [dialog_test60]主角头上再一个气泡。

命令执行条件 cond:

在任何一个@命令的后面,接一个空格+cond:+条件,就能为此句命令限制上一个执行条件,当条件不满足时此句命令被跳过。经常被用来和@jump一起使用来控制跳转,代替if else或for循环

@jump *no_money cond:$money==0
@jump *money_enough cond:$money>=10
@jump *money_too_much cond:$money>=10000

流程控制

跳转 @jump

跳转到某个标签

@jump *next_dialog

结束剧本 @end

立刻结束剧本,回到玩家控制

选择支 @sel @selstart

几行@sel 然后接一个@selstart,会开启选择支。在@sel后面的方括号里写选择支id,以及默认的中文版文本。玩家选择之后,会跳转到对应的 *sel_选择支id 标签上

注意1,菜单中的addTextId功能并不会给选择支的方括号里加上选择支id,所以需要写剧本时自己就定好选择支id

注意2,选择支之前最后说的一句话,并不会在出选择支时消失。比如下面例子里[before_sel10]那句话在弹出选择支时不会消失。如果希望它消失,可以加一个很短的等待命令@wait t=0.01

比如:

x: [before_sel10]要答应他吗?
@sel [ok]我答应
@sel [cancel]拒绝
@selstart

*sel_ok
rice: [ok10]好,我答应就是。
@end

*sel_cancel
rice: [cancel10]恕我拒绝。
@end

切换地图和地图层 @map @layer

@map 地图名 layer=层名 pos=pos对象名 blackin=切换前是否有黑屏渐入,默认是 blackout=切换后是否有黑屏渐出,默认否

@layer 层名 pos=pos对象名 blackin=切换前是否有黑屏渐入,默认是 blackout=切换后是否有黑屏渐出,默认否

注意,切换地图或层之后,都会执行一次层上挂的那个剧本。

显示标题画面 @title

临时用的,后续可能再完善

演出控制

等待@wait @w

@wait t=等待时间

@wait t=1
@wait t=$wait_time

音频 @bgm @xbgm @bgmv @bgs @xbgs @se @xse

事先在fmod中定义好,使用时不用写bgm_ se_ bgs_前缀

@bgm bgm名 v=音量
@xbgm direct=是否无渐出立刻停止,默认否
@bgmv v=音量
@se se名 v=音量 loop=是否循环,默认否
# 停止se仅对循环se有效
@xse se名
# 混响效果也是一种se,使用时要用pn pv参数(具体在fmod中定义
@se reverb pn=room pv=0.76 loop=true
# 关闭混响
@se reverb pn=room pv=0 loop=true
@bgs bgs名 v=音量
@xbgs

移动和改变位置与朝向 @move @movejump @pos @dir

只改变朝向可以用@dir

@dir npc名 d=1或-1 
@dir npc名 face=要朝向的npc名

只改变位置和朝向时,可以用@pos,支持上面的d和face用法

@pos npc名 pos=pos名或npc名
@pos npc名 x=x坐标 y=y坐标

控制移动使用@move,支持上面的所有用法,但位置分为初始位置opos/ox/oy,和终点位置pos/x/y两类。一般只需要指定时间、路程、速度中的任意两个值即可,如果只有路程或时间,也会按默认速度(4.5)来计算。速度区分指定v或vx/vy,常用的应该是vx的横移用法,比如下面例子的第四行。

@move npc名 dx=2 t=1
@move npc名 pos=target_pos v=5
@move npc名 x=target_pos.x t=$move_time
@move npc名 ox=start_pos.x x=target_pos.x vx=3.5 wait=false

这个移动同样也可以控制主角,但在物理生效的环境下并不能精准完美地控制主角,主角只能以他自己的速度在保证路程正确的情况下尽量准确地移动,好处是可以让主角在此情景下上下坡、有碰撞地运动。如果想让主角像npc一样被控制,需要加一个npclike=true属性

主角在移动时会自动改变动画,但npc并不会。所以请用动画控制的属性来决定它们的起始动画和停止动画。现在暂只支持trigger和int两种方式。

@move npc名 pos=target_pos tg=moveTrigger endtg=stopTrigger
@move npc名 pos_target_pos i=moveInt iv=1 endi=moveInt iv=0

跳跃请用@movejump,比@move多一个h属性,而且此属性必须写,用来定义跳跃的高度。此高度具体是是指比起点和终点中偏高的那一点要高多少。对于npc,可能还需要指定fall动画,这样看起来更自然。

@move player dx=0 h=0.5
@movejump npc名 dx=4 h=0.5 tg=jump falltg=fall endtg=fallGround

对于主角,在物理环境下,通常还未落地命令就会结束,所以不要依赖wait=true,最好自己手动写一个@wait t=估计的合适的时间

动画@anime

@anime npc名 tg=动画Trigger

此命令不含等待功能,如果需要等请用@wait手动控制等待

显示表情@emo

@emo npc名 n=表情名

表情名对应emo预设动画机上的trigger名,目前有:question surprise found silent happy awk angry thinkout

npc控制 @npccmd

以下这些命令都定义在了 npccmd 中,但为了使用方便,也给它们起了别名。通用语法是:

@npccmd npc名 cmd=命令名 参数=...

比如:

@npccmd npc1 cmd=active
@npccmd npc2 cmd=order n=sword o=100

但为了使用方便,推荐使用下面的别名用法。

它们的功能都具体实现在了StoryNpc中,StoryNpc的NeceList就是为了这些功能准备的,可以把需要控制的对象拖进去。

# 冻结npc,让它即使在可见的情况下也不能交互。切换地图后失效
@freeze npc名
# 解冻
@unfreeze npc名
# 显示/隐藏对象。如果是npc,隐藏之后甚至将无法交互。注意这个如果和剧本头里定义的显示/隐藏相冲突的话,
# 可能会被剧本头的操作覆盖。如果不想一个npc被剧本头影响,把它的trigger类型改为No Cond
@active npc名
@unactive npc名
# 还可以显隐neceList里拖入的对象。这样就不用给每一个对象都挂StoryNpc了
@active npc名 n=neceList拖的对象的名
@unactive npc名 n=neceList拖的对象的名
# 显示/隐藏对象的图片。如果是npc,隐藏图片之后仍然可以交互。
@show npc名 
@hide npc名
# 还可以显隐neceList里拖入的对象
@show npc名 n=neceList拖的对象的名
@hide npc名 n=neceList拖的对象的名
# 改变图片层级
@order npc名 o=层级数字
@order npc名 n=neceList拖的对象的名 o=层级数字

画面控制

黑屏白屏单色屏 @solid

@solid 颜色名 t=时间

颜色定义在StoryTeller类的GetColor方法中,目前支持: black white red

如果想渐出黑屏,不需要写颜色名

@solid t=时间

闪屏 @flash

@flash 颜色名 t=时间 颜色定义在StoryTeller类的GetFlashColor方法中,目前支持: white red blue cyan

为了保护眼睛,闪烁色用的是半透明并且比较轻的颜色,所以和单色屏的颜色分开定义

图片遮罩 @frame

@frame show=是否显示 t=时间

目前只有一个当角色思考时使用的半透明黑色遮罩,如果有需要以后可以添加其他。

显示CG @cg @scg @scgdec @xcg

CG分为两类,一类是简单的图片cg,放在Assets\Resources\image\cg\目录下,一类是有很多零件差分或者有动画的预设cg,放在Assets\Resources\prefab\Cg\目录下,预设cg根结点需要有SpecialCg的组件

# 显示图片CG,不用写cg_前缀,也不用写扩展名.png
@cg 图片名 t=时间
# 显示预设CG,不用写cg_前缀
@scg 预设名 t=时间 show=默认显示的零件,用逗号分隔(被拖到SpecialCg的DecList中的就是零件
# 显示或隐藏预设CG中的零件,需要已经显示了预设CG的情况下才能用
@scgdec show n=零件名 t=时间
@scgdec hide n=零件名 t=时间
# 隐藏cg,对图片cg和预设cg都有效
@xcg t=时间

聚焦效果 @focus

# 显示大概200x200的聚焦圈,可以用scale来扩大,不推荐调小
@focus show scale=1.0 pos=pos名 t=时间
# 隐藏
@focus hide t=时间

震屏 @shake

@shake 震动名 这个使用了ProCamera2D的震动功能,需要在它那里定义震动,然后保存到Assets\Resources\system\目录下,不用写前缀shake_

相机控制 @cam

# 移动相机
@cam move pos=移动目标的pos名 t=时间 fo=是否在移动后绑定它,默认否 ease=移动的EASE方式。可以在Common.N2Ease方法中增加。常用的比如 l=linear oc=OutCubic ios=InOutSine 
# 一旦移动,它会自动和主角解绑。所以如果需要剧本结束后重新绑定主角,需要在剧本结束时加写一句相机移动到主角并绑定
@cam move tar=player fo=true t=1
# 缩放,尺寸就是Camera的尺寸,可视分辨率算法是 尺寸=可视范围分辨率的y值/200,所以默认的1080分辨率的尺寸是5.4
@cam scale size=尺寸 t=时间 ease=移动的EASE方式
# 不写size会恢复设定成ProCamera2D根据边缘计算出来的推荐尺寸(也就是每次刚进一个新地图时的默认尺寸)
@cam scale t=1 ease=co

缘相关 @yuan @yuanwait @ywait

# 添加缘线,最后在剧本一开始的一个地方统一添加管理
@yuan add tar1=npc名 tar2=npc名 c=颜色名 dx1=tar1的偏移x dy1=tar1的偏移y dx2=tar2的偏移x dy2=tar2的偏移y g=分组名 show=是否立刻显示,默认否
# 显示与某一对象有关的所有缘
@yuan show tar=npc名
# 显示某一分组的所有缘
@yuan show g=分组名 
# 显示某一分组内,与某一对象有关的所有缘
@yuan show tar=npc名 g=分组名
# 显示某两个对象之间的缘
@yuan show tar1=npc名 tar2=npc名
# 隐藏缘,分组名不写就隐藏所有缘
@yuan hide g=分组名

# 切缘的小游戏,如果已经是最后一波,可以不写next
@yuan cyan cur=当前分组 next=背景展示的下一分组 id=定义一个id,跳转标签用的
# 在小游戏中执行了什么剧本后,把控制权重新交还给玩家,两个一样,后者是简写
@yuanwait
@ywait
# 结束小游戏
@yuan cyanend

设置相关

切换主角 @player

  • @player tri

  • @player rice

  • @player skin

设置字符串 @str

@str [talkid]默认的中文字符串

这个设置的功能是为了和对话一样,设置中文版的字符串,其他语言的字符串会在各自的翻译文件中设置

名字遮罩 @namemask

@namemask 真名 mask=遮罩名

想取消遮罩显示真名的话,不写mask。

使用场景是,刚见面的npc还不知道它的姓名,知道了真名后再正常显示真名。那么事先在zh_cn.json里定义好他的真名和遮罩名

,{"id":"boy", "value":"少年"}
,{"id":"yc", "value":"杨葱"}

在实际使用中

@namemask yc mask=boy
yc_simple: [talkid10]说这句话时,名字牌显示的是“少年”。
@namemask yc
yc_simple: [talkid20]说这句话时,名字牌显示的是“杨葱”。

系统

显示变量值 @print

@print $变量名

调试用的命令

上一页Godot优缺点笔记

最后更新于2年前

这有帮助吗?