ink-面向文字游戏的预处理脚本语言
引言
大家好,这是一篇介绍ink的文章。
ink是由inkle公司推出的一种脚本式的文字预处理语言用来编写一些对话类游戏的对话内容及流程图。inkle公司做出过一些很棒的对话类游戏,如《80天环游地球》。
初次浏览,ink像是带有逻辑的小说文本,通过简单的符号标记来组织内容文本以及对话的流程。
但ink的整体教程看下来,可以看出inkle是把ink作为一个脚本语言而非文本标记语言来设计的。不过我个人认为,ink的逻辑部分设计的有一些复杂,这使得该语言介于脚本语言和带有逻辑的小说文本之间,但又两边都不太讨好。
但这并不妨碍我们学习他们的思路,看看他们认为文字游戏的内容应该如何被组织起来。
快速感受ink的魅力,从官方的在线编辑器开始。
而除却上面说到的在线编辑器,inkle公司针对ink还提供了三个开源项目:
- ink本体及教程
- inky,一个ink的离线编辑器,可实时预览
- ink的Unity插件支持
其中,inky是一个非常赞的ink编辑器,它会实时的编译你的脚本并向你展示一个可以互动的文本流。
第一部分:基础语法
1) 内容-Content
内容其实就是最简单的文字,编辑器会将内容原封不动的展现。
同时,ink允许用户添加注释。
示例如下:
2)选择-Choices
一个简单的选择就是* 后面跟选项,然后接着写对应选项的内容。直到遇到跳转符号或者另一个选项或者结尾。
示例如下,选择前:
选择走右边之后:
由于选择的截图稍微难截一些,后续我会使用
1:走左边
2:走右边
来代替选项,使用
1>走左边的结果
来代替我的选择以及对应显示的文字。
3)节点-Knots1
节点是一整段的文字内容,他可以被其他的内容引用或者跳转。
节点的声明格式如下
=== 节点名称, 由字母数字下划线组成 ===
在上文中我们没有声明节点的内容被称作无节点内容,而无节点内容文本流会被节点阻碍,不再继续显示。
同时,当脚本内不存在无节点内容时,程序将自动寻找第一个节点作为起始对话节点。
而我认为,节点是ink中的内容基础单元。他们被各种形式的逻辑串在一起形成文本流。
节点示例如下:
4)跳转-Diverts
在ink中,跳转是指从某一内容后跳转/链接到另一节点。
被跳转的内容可以是无节点内容或者节点,但是跳转的目标必须是一处节点内容。因为跳转声明时,必须指定跳转的目标,一般来说目标为已声明好的节点名。
在上文的实例中,我们已经看到了不少跳转的使用用例。跳转的声明方法是:
-> 欲跳转的节点名
比如在节点一章的示例中:
我必须跳转到stop_here,否则文本流会被阻碍
-> stop_here
意思是从此处接入stop_here处的内容,最终显示结果为
我必须跳转到stop_here,否则文本流会被阻碍
同时节点在定义的时候不会显示同时会阻碍文本流…………
值得一提的是,ink提供了一种类似于连字符的东西,黏结-glue对应的符号是:<>。使用<>来修改刚才的示例:
我必须跳转到stop_here,否则文本流会被阻碍<>
-> stop_here
则”……阻碍”后面会忽略换行,等同于
我必须跳转到stop_here,否则文本流会被阻碍-> stop_here
这样的写法。最终显示结果为:
我必须跳转到stop_here,否则文本流会被阻碍同时节点在定义的时候不会显示同时会阻碍文本流…………
5)分流-Branching The Flow
分流实际上并没有语法规定,他是一种逻辑概念。主要是指从一个节点通过选择跳转到若干节点的行为。
节点和跳转组合起来形成最基础的故事流,这是一种较为扁平的结构。剧本作者可以直接单拉某一个节点或者某一段故事流出来编写而不用担心结构过于混乱,或者需要追踪某一分支的状态。
常见的ink脚本从第一个节点开始,顺着拥有着各种分支的庞大故事流走向最终的