Articy Draft 3 与 Unity
Articy Draft 3 与 Unity
Articy Draft 3
是Steam上的一个做叙事游戏数值剧情策划的软件,为了去结合Unity或是Unreal,可以作为一个独立的第三方软件(不是插件)使用。最近出了免费试用版,但是有一定的容量限制(660个游戏物体或对话),但是能够符合一个基本的小型游戏或弱叙事游戏使用了。

- 鉴于属于一个比较方便的文字建模软件,于是我就其官网上的生肉以及实践做出了以下学习笔记。
- 这个笔记只涉及一些文字游戏的基础功能,像高级功能诸如地点和旅程就不涉及了。
- 当然,还有B站好心人搬运的视频,AD的基础使用按键操作什么的就不讲了,看视频就能明白。
**翻译中比较让人困惑的地方:
- 在软件中有一堆以“复数”为开头的中文翻译,例如:“复数资源”,实际上指的是资源单词的复数形式:”Assets”,请自动省略掉”复数”两字。
- 软件中把Location翻译成了地点,实际上Spot才是地点,但是Spot被翻译成了“斑点”,这也是翻译错误。
(甲)主要世界观
- 属性(Property):
- 属性是代码层面上的最基础的单位,基本对应的是对于数值类型的定义:布尔值、基础数值。

- 特性(Feature):
- 特性是由许多属性构成的结构体,比方说玩家和npc们都有基础特性:血量、攻击力、敏捷,而玩家可能在此基础上还拥有只属于玩家的玩家特性:经验、背包容量等。

- 模板(Template):
- 每一个流程中的节点、每一个工程里的资源文件,都可以使用其规定类型的自定义模板。模板是由许多特性构成的集合,比如玩家PC的模板与电脑NPC的模板中特性的分布不同。

- 实体(Entity):
- 实体可以类比Unity中的GameObject,Unreal里的Actor,每个实体能使用一个模板。人物可以是实体,道具可以是实体,一些抽象的命令也可以是实体。

- 流程(Flow):
- 流程是故事叙事大纲,是一个节点面板,可以在此处编写逻辑和故事。

- 全局变量(Global Variables):
- 全局变量规定必须属于一个变量集,所以必须先创建变量集,在里面才能添加全局变量。就比如说一些基础判断布尔,整数数值的累积,以及字符串。

- 地点(Location):(本指南不涉及)
- 许多日式解谜游戏都喜欢在一个固定的图片画面里藏一些鼠标点击才触发剧情的东西,这里边有一个基础的地图绘制系统。(免费版地图上限只有10个)

- 旅程(Journeys):(本指南不涉及)
- 这里的旅程指的是RPG游戏中的好结局(GE)坏结局(BE)之类,规定玩家必须走哪个流程才能达成结局。

(乙)流程(Flow)中节点
- 流程片段(流片段)(Flow Fragment)
- 流程片段是一个最基础的节点,可以作为一个剧情容器,将其他剧情对话放在容器中。
- 左上角需要选择预览图像;右上角需要拖拽一些引用的实体;在下方填入说明文本。

- 对话(Dialogue)
- 对话节点主要代表一个完整的对话,而不是一个人说的一句话。与流程片段节点几乎等价。
- 左上角需要选择预览图像;右上角需要拖拽一些引用的实体;在下方填入说明文本。

- 对话片段(Dialogue Fragment)
- 对话片段是一个人说的一句话,需要“沉浸”到对话片段中(放于节点子集)。
- 上方发言者需要引用一个实体;头像槽右方需要填写菜单文本,菜单文本显示在当该节点需要通过分支选项按钮点击进来时,分支按钮上显示的文字;下方舞台指示区是一些剧本的提示信息,比如人物实体说话时的语气,供后期配音演员比对;最下方是对话的实际文字。

- 核心(Hub)
- 核心是一个抽象的状态,多个对话可以链接到同一核心,核心也可以输出到多个对话中,相当于集线器。

- 跳转(Jump)
- 方便跳转到某个节点上,例如核心节点。
- 跳转需要在槽中填写将要跳转的节点,一般是核心(Hub)节点。

- 条件(Condition)
- 条件需要你去写脚本,当条件满足,跳到绿色输出针脚;当条件不满足,则跳到红色输出针脚。
- 需要填写条件。

- 命令(说明)(Instruction)
- 命令说明节点是设置条件,修改数值。
- 需要填写命令。

- 注释(Annotation)
- 就是注释,没别的活儿。

(丙)物体基础信息查看
- 以流程片段(FlowFragment)节点为例,在流程(Flow)面板里选择该节点,右键打开属性(F8):
- 技术名称:该节点在代码中调用时所称呼的名称,没有两个游戏物体的技术名是一致的。
- ID:代码中也可以调用该物体的ID,削微有一点不常用。

- 点开“模板”标签,如果提示没有应用模板,则按右边的按钮选择一个模板。
- 例如此时的模板名为FlowFragMessage,该模板下有两个特性:NodeMessage和DiaMessage,NodeMessage特性下又有一个布尔属性:isLastNode。

(丁)Articy:Expresso表达式
- AE表达式主要是为了配合条件和命令两个节点来使用的,基本上就是普通编程语言的青春版。
如何获取基础信息
- 基本上获取下列两种游戏信息就足够了:
- 全局变量:
- 可Get可Set:
[变量集名].[变量名]
- 可Get可Set:
- 属性变量:
- Get方法:
getProp(getObj("[物体技术名]"), "[特征名].[属性名]")
- Set方法:
setProp(getObj("[物体技术名]"), "[特征名].[属性名]", [新值])
- Get方法:
- 全局变量:
条件节点(Condition)
- 条件节点里面唯一要填写的是一个布尔变量;这个布尔变量由判断表达式构成:
- 判断操作符:
等于==
不等于!=
小于等于<=
大于等于>=
小于<
大于>
- 逻辑操作符:
与&&
或||
- 基础运算符:
加减乘除余+-*/%
- 判断操作符:
- 比方说我在全局变量集MyVariableSet里有布尔变量isOpened,我需要在一个节点前先判断是否isOpened是真,就可以这么写:
MyVariableSet. isOpened == true
(没有分号结尾)
- 比方说玩家人物的技术名称为PC_Player,判断其模板中BasicFeature特性中attack数值属性是否大于10,就可以这么写:
getProp(getObj("PC_player"), "BasicFeature. attack") > 10
(没有分号结尾)
- 如果该节点是对话片段(Dialogue Fragment)节点,发言者正好是玩家,就可以直接调用其发言者speaker:
getProp(speaker, "BasicFeature. attack") > 10
(没有分号结尾)
- 在流程(Flow)中的带引脚的节点的左引脚可以双击,在弹出的对话框里可以写入条件。
命令节点(Instruction)
- 命令节点里需要填写赋值命令,以英文分号间隔;命令节点里除了基础运算符之外,还有:
- 引用运算符:
自增+=
自减-=
自乘*=
自除/=
自余%=
- 引用运算符:
- 如果我要修改MyVariableSet变量集里的isOpened布尔值:
MyVariableSet. isOpened = true;
(每一句都要有分号结尾)
- 如果我要修改玩家实体的BasicFeature特性中的attack数值:
setProp(getProp("PC_Player"), "BasicFeature. attack", 10);
(每一句都要有分号结尾)
- 如果玩家属性是需要自增的,就必须先getProp,再setProp:
setProp(getProp("PC_Player"), "BasicFeature. attack", getProp(getObj("PC_player"), "BasicFeature. attack") + 1);
(每一句都要有分号结尾)
- 在流程(Flow)中的带引脚的节点的右引脚可以双击,在弹出的对话框里可以写入命令。
(戊)Unity代码层面获取信息
- 引用
1 | using Articy.Unity;//Articy的主要内容 |
- 使用检视界面来获取物体引用
1 | [//使用属性限制取值类型 ]))] |
- 获取或设置全局变量
1 | bool globalBool = |
- 使用数据库来获取物体属性
1 | float property = 0; |
(己)自制AD模板与其所对应的Unity模板
警告
- 在此Unity模板中需要有第三方Unity插件:
- Odin Inspector:做编辑器界面的,没有也没关系,把爆红的删掉就行。
- Text Mesh Pro:Unity的一个隐性内置文字插件,需要在Package Manager里面安装。
- Anima Text:做文字动画的插件,没有也可以,删掉就行,不妨碍,大不了没动画。
AD模板设置
- 特性定义:
- ActorFeature:
- (数值)hitPoint:100,0,100,0(默认值,最小值,最大值,小数位数)
- (数值)attack:1,1,20,0(默认值,最小值,最大值,小数位数)
- (数值)defense:0,0,100,0(默认值,最小值,最大值,小数位数)
- (文本小)actorName:_, , , (默认值,……)
- NodeMessage:
- (布尔)isLastNode:False(默认值)
- DiaMessage:
- (数值)startDelay:0,0,100,2(默认值,最小值,最大值,小数位数)
- (数值)branchDelay:0.25,0,100,2(默认值,最小值,最大值,小数位数)
- (数值)passDelay:0.1,0,100,2(默认值,最小值,最大值,小数位数)
- (数值)wordSpeed:5,1,10,0(默认值,最小值,最大值,小数位数)
- ActorFeature:
- 模板定义:
- (复数流片段)FlowFragMessage:NodeMessage,DiaMessage
- (复数对话)DialogueMessage:NodeMessage,DiaMessage
- (复数对话片段)BasicDialogue:NodeMessage,DiaMessage
- (复数核心)HubMessage:NodeMessage
- (复数条件)ConditionMessage:NodeMessage
- (复数说明)InstructionMessage:NodeMessage
- (实体)Player:ActorFeature
- (实体)NPC:ActorFeature
- 模板使用方法:
- 在流程(Flow)根画布上新建流程片段,表示第一章的所有内容归类。
- 注意:包括此节点在内,接下来所有节点都必须应用上面所规定的模板!
- 在此流程片段上按回车,进入节点子集,新建对话(不是对话片段),表示一大段的对话。
- 注意:对话节点需要与虚框上左右两边的输入输出节点相连!
- 在此对话节点上按回车,进入节点子集,新建一些对话片段,彼此相连(包括虚框),在最后一个对话片段节点上右键属性,将NodeMessage特性里isLastNode设为true,表示这是对话的最后一个节点。
- 在最后一个对话片段之后再新建一个流程片段节点,其标题名设置为此段对话的结束按钮名。
- 注意:首尾节点需要与虚框上左右两边的输入输出节点相连!
- 在流程(Flow)根画布上新建流程片段,表示第一章的所有内容归类。
将AD的工程信息导入到Unity中
- 点击AD界面左上角圆形菜单,点导出,跳出导出页面:
- 选择技术输出中的Unity导出,应用默认的导出规则集,选择Unity工程的Assets路径为导出文件夹。
- 点“好的”。(前提是Unity需要到Asset Store上下载导入器,否则无效)
Unity模板
- Unity的Asset Store上面搜索Articy Draft,将导入器下到工程里。
- 注意:导入器不可变更其绝对路径!
- 当在AD里将工程信息导入之后,按照如下步骤建立对话系统:
- 在大纲里新建Canvas画布,添加ArticyFlowPlayer组件。
- 在此Canvas画布里构建一个拥有:
- 作为对话头像预览的Image组件。
- 作为对话的实际文本框的TextMeshProUGUI组件。(此文字组件再加上AnimatextTMProOld组件,如果有Animatext插件的话)
- 作为自动生成的分支按钮所存放的父级,这里推荐使用ScrollView卷轴。
- 新建脚本ArticyBranch,将其加在一个新建的按钮Button上,将按钮设为预制体,并将实例删除。
- 新建脚本ArticyFlowManager,并将其加在Canvas画布的ArticyFlowPlayer下。
- 将Canvas画布设为预制体。
- 新建脚本ArticyInitTrigger,并将其加在一个trigger触发器上,将Canvas画布预制体放到trigger触发器的子集,将画布的Enable设置为false,将trigger触发器设为预制体。
脚本ArticyFlowManager内容
脚本功能介绍:将ArticyFlowPlayer里面所播放的节点的隐性数据使用UI来公之于众。(为了实现Articy的IArticyFlowPlayerCallbacks接口)
branchPrefab:按钮预制体
txt_mainText:对话文本框
rTrans_branchParent:按钮父级
img_previewImage:对话头像预览UI
IsPlaying:对话运行状态
showFalseBranches:是否允许出现非法分支
flowPlayer:绑定的ArticyFlowPlayer播放器组件
StartOnFlow:对话从哪个节点开始
key_forceJumpDelay:跳过按钮出现等待时间的按键
textEffect:Animatext插件模板(在文末有模板数据)
intervalRange:每个字出现耗时的最小值与最大值

1 | using System.Collections; |
脚本ArticyBranch内容
脚本功能介绍:为按钮的点击接口onClick添加监听器Listener,使其在点击之后能与ArticyFlowPlayer反应。

1 | using System.Collections; |
脚本ArticyInitTrigger内容
脚本功能介绍:这个脚本可有可无,主要在实现当某个游戏物体(特别是玩家)进入触发器时能够从头开始播放。
flowPlayer:所绑定的ArticyFlowPlayer播放器组件
tagConstraint:触发器检测到当拥有限制的标签的碰撞箱时,开始触发流程
isDestroyWhenPlayed:当流程结束时,是否删除这一切
onTriggered:当触发的那一瞬间所执行的委托
onFinished:当播放结束的那一瞬间所执行的委托

1 | using System.Collections; |
Animatext模板(有插件的情况下)
- 在Project工程目录里右键新建Animatext Preset->Transition-Word->Step->01
- 如下图设置,并赋予给所有AnimatextTMProOld组件上。

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Iamsleepingnow 世界!