NovaScript - Lunatic-Works/Nova Wiki

NovaScript脚本语言

基础

Nova的脚本格式称为NovaScript,主要由文本和Lua代码块组成。文件后缀名一般为.txt(需要被Unity识别为text asset),建议用支持Lua语法高亮的编辑器来编辑。

脚本文件一般放在Assets/Resources/<作品名称>/Scenarios/文件夹下,文件位置在GameController.prefab中由GameState.scriptPath设置。

一部作品的脚本由许多节点(node)组成。脚本可以被拆分为多个文件,一个文件中可以有多个node。脚本解析的结果与读取文件的顺序无关,除了节点名称的默认值。

每个节点的开头和结尾处各有一个提前代码块(eager execution block),语法为@<| ... |>。它记录着关于节点的信息,比如每一章的标题和分支选项等等,在游戏开始之前执行。

一个节点中有很多“条”对话(dialogue entry)。每条对话可以包括一个延迟代码块(lazy execution block),语法为<| ... |>,以及一些文本。延迟代码块记录着这条对话对应的演出代码,在游戏过程中执行。

文本中可以用::::分隔角色姓名和台词。(台词前后的引号“”不是NovaScript语法的一部分,游戏制作者可以选择其他排版习惯。)

文本中可以使用TextMeshPro提供的rich text XML标记。

两条对话之间由一个空行分隔。一条对话的文本可以有许多行。如果文本中需要空行,可以写一个空的XML标记<b></b>

一条对话的延迟代码块和文本之间不应该有空行。(如果有空行,就会变成两条对话,点一下鼠标执行代码,再点一下鼠标播放文本。)

节点开头的提前代码块和第一条对话之间,以及最后一条对话与结尾的提前代码块之间,也不应该有空行。

建议在一个代码块中按以下顺序写代码:角色、背景、前景、时间轴、音乐、音效、对话框、语音、其他系统设置。

Tools/Scenarios/lint.py可以用于检查脚本的一些常见问题。

Unity中的使用方法

Nova提供的Lua文件放在Assets/Nova/Lua/文件夹下。

我们目前使用的Lua绑定库为tolua#,它使用的Lua语言版本为LuaJIT,与Lua 5.1完全兼容,Lua 5.2的特性只有一部分兼容。

修改Lua文件之后,build游戏之前,需要在Unity Editor的上面的菜单中运行Lua -> Copy Lua Files to Resources,详见程序打包时的注意事项

要把C#接口绑定到Lua,需要给class加一个[ExportCustomType] attribute,接下来就能给这个class中所有public的field、property和method生成Lua接口。

修改C#接口之后,需要在Unity Editor的上面的菜单中运行Lua -> Clear Wrap Files,然后按提示重新生成Lua接口。

在Unity Editor中运行游戏时,修改Lua文件或脚本之后,按R可以重新加载脚本,而不用重新运行游戏。但是由于一些缓存机制,重新加载的脚本可能会出现错误,这时需要在Unity Editor的上面的菜单中运行Nova -> Clear Save Data来清空存档。

如果一开始游戏,Unity Editor就闪退,也可以试试清空存档。

脚本结构 script_loader.lua

图像 graphics.lua

声音 audio.lua

对话框 dialogue_box.lua

动画系统的说明

动画高层接口 animation_high_level.lua

动画低层接口 animation.lua

TODO

转场与特效 transition.lua

时间轴 timeline.lua

视频 video.lua

变量 variables.lua

TODO

警告与通知 alert.lua

自动语音 auto_voice.lua

TODO

头像 avatar.lua

TODO