最近在做一个 NPC 的 AI,不想写代码,看看库里还有去年 HB 包里的 NodeCanvas,想着拿出来学习一下,不然不知道又得吃多久的灰了...
首先这种高质量的插件都有相应的官方网站,所以我的第一建议是查询官方手册和解决方案: https://nodecanvas.paradoxnotion.com
一:导入插件

在菜单栏 Tools 里看见选项 ParadoxNotion 即导入成功
二:导入样例
在下载完成后这个包里是没有 Sample 样例的,是可能比较迷惑的一点,不过不要担心,官方网站是有提供的,我们参照实例解读学习,下载后正常导入 Assets 即可
样例下载地址(下载 Example Scene Unity 2018.4.14+):https://nodecanvas.paradoxnotion.com/downloads/
首先我们在 Project 窗口里找到我们导入的文件夹(如图2-1),观察到有两个文件夹,而 _Common 文件夹是存放一些预制和代码的,其实例部分是在 Scene 文件夹,打开可以发现有三种样例场景,正是对应了 NodeCanvas 三个核心功能模块

· BT Scenes(Behavior Tree):行为树,我的理解是做一些 Enemy、NPC 自动化的处理行为
· DT Scenes(Dialogue Tree):对话树
· FSM Scenes(Finite State Machine):有限状态机,能自主操作的对象的状态设置
三:了解编辑器
我先选择 BT Scenes 文件夹中的 Events 场景来举例
打开场景后,观察 Hierarchy 窗口里的物体,有个叫 GameObject 的物体较为特殊,因为它的右方有个小图标,那就是带有 Node Canvas 行为树 Component 的个体,然后观察它的 Inspector 窗口,点击 Behaviour Tree Owner 组件的 EDIT BEHABVIOUR TREE 即可进入 Canvas 编辑器(如图3-1)

我们来了解一个重要的东西 —— 节点 Nodes
在 Canvas 面板上空白处,右击或是空格可以调出节点面板,如图3-2

注意:这里三个不同的状态机的节点是不一样的,后面会讲述
BT 节点类型:
Action:事件节点,添加自定义的事件,达成自定义条件后执行,返回一个自定义的 Failure 或 Success 值
Condition:条件节点,添加自定义的条件,达成自定义条件后执行,返回一个 Failure 或 Success 值
Composites:进入到子页面,可以选择一个复合执行路径顺序(方法)
Decorators:进入到子页面,有非常多的条件判断方式、执行方式
SubGraph:可以创建并连接其他的状态机
因为有如此丰富的节点,一个个在这描述不太现实(可查询手册,更详尽清晰),所以要引出一个重要的学习方法——看注释
如图3-4 ,这里选择 #1 节点,红色框选的内容就是该节点的注释,通过注释我们能了解该节点具体内容:做什么事,返回什么值等等(节点类型是图3-2里的其中一个)

在了解每个节点的作用后,我们开始试着理解整个流程
一般是,从上至下,从左至右的顺序查看(Composite 箭头方向),所以先看 #0 ,我们前面讲过一个 Composite 节点类型,这表示子节点运行的方向方式,这里是 Composite 中的 Selector 节点,第一,阅读注释,简述一下:「计算所有子节点,如果所有的子节点返回 Failuer 那么该节点返回 Failure ,如果有一个子节点返回 Success ,则该节点返回 Success」,然后看 #1,这是一个 Condition 类型的节点,里面有一个重要的按钮,Assign Condition Task,通过它可以命令该条件节点分配什么任务,比如这里是检测一个事件,所以在这个示例中我们需要找到该事件的发出者,一般来说要么是单独的脚本挂载在该人物上,又或者是其他的节点发出,该示例就是通过 #7 节点发出的事件,这是一个 Action 节点,不是上面 Condition 判断类的,是直接执行你分配的任务,这里的任务就是延迟一秒发送事件,将 Event Value 设置为 50,然后 #1 节点再将 Event Value 的值赋给设置的全局变量 value,我们再看 #2 ,这是最简单的 Composite 类型的节点,就是从左至右执行并返回子节点结果,#3、#4 就分别是打印 value 值和重新将 value 值设置为 0
整个流程就是,按下空格键(#6),发送名为「My event」的事件(#7),然后接收事件并赋值 value(#1),打印值(#3),更改值(#4)
可能会有一些问题:
Q1:#0 上的 start 什么意思?如何设置?
A1: start 就是整个流程第一个开始运行的节点,右击 Set Start 即可如图3-5(整个流程只能有一个 start)

Q2:#0 中的 Dynamic 什么意思?为何勾选?
A2:将鼠标置于上方,如图3-6 的注释描述,表示「会每帧都计算子节点返回值的类型,如果有一个 Success,那么立即终止其他还在计算的返回类型,并执行该子节点,返回 Success」

Q3:节点旁边的像 #0、#1 这样的没有
A3:如图3-7勾选

Q4:什么是全局变量?
A4:如图3-8,就是在黑板可以定义不同类型参数,供给该编辑器 Graph 在任何节点有需要的话可以调用,也可以在菜单栏 Tools -- ParadoxNotion -- Node Canvas -- Create -- Global Scene BlackBorad 创建所有场景都能调用的变量参数(@GlobalBlackboaed 命名后存好为预制,并在其他场景拖出来即可)

四:DT 示例
打开文件夹 DT Scenes 中的 DialogueExample 场景示例
上面提到的,先找那个小图标,也就是空物体 DialogueTree,点击 EDIT DIALOGUE TREE,进入编辑器,我们右击或是空格可以发现,节点不一样了,但没关系,一样先看示例,读注释,首先看第一个 #0 say 节点,意思比较容易理解,就是选择一个 Actor 来执行文本框的对话,因为是 Start,所以他是第一个执行的节点,然后待 #0 说完后,就是 #1 ,完后就是 #2,这是 Branch 节点类的 Multiple Choice 复合对话框,这里要选中 #2 选择左边框内的 Add Choice 才能添加对话,每个对话我们都可以添加任务,其中有个 Available Time 是设置对话持续的时间,拉到 0 可以自动不消失,然后这里添加的是一个 Bool 值的判断,设置了两个全局布尔变量,再往下就是各个支节点,依次往下阅读就是说话然后做 Action 节点直接做指定的任务,这里就是播放动画然后设置两个全局布尔值为 True,以达到下面 #6、#10 Control 类型的 Jump 节点到Multiple Choice 复合对话框,以至于不重复对话
但其实光这个编辑器里的内容是不够组成对话的
上面提到的,我们其实还要去设置 Actor,在 Hierarchy 窗口里有三个人物(Player、John、Doe),随便点击一个查看 Inspecter 窗口里的内容,是需要 Add Component 一个叫 Dialogue Actor 的脚本组件,还有示例中需要的 Animation 组件(控制动画),为需要对话的角色添加了这个脚本后,再去找这个示例是如何触发这个对话的
在 Hierarchy 窗口里有个叫 CLICK ME 的物体,它是添加了 Text Mesh 的,也就是说点击文字 「CLICK ME」就可以触发动画,关键还在于它自身添加了 Click To Start Dialogue 组件,它所需要的 Dialogue Controller 就是上面提到的空物体 Dialogue Tree(其自身有 Dialogue Tree Controller 组件),拖拽上即可
回头如图4-1,依次添加三个 Add Parameter,把上述的三个人物拖进来(其自身有 Dialogue Actor组件),编好名即可返回编辑器,为每个节点把说话的人物选择上即可,如图4-2


OK,这个示例应该是解读的差不多了,还有几个节点示例没有给出,自己可以研究一下噢
可能有一些问题:
Q1:有其他方法触发对话吗?
A1:当然,上面提到了一个 SubGraphs 节点类型记得吗,利用它就可以连接起 BT 或 FSM了(也可以在 DT 里再套一个 DT ,也就是调用另一个对话)
Q2:我在自己场景弄了一个对话 AI,但显示一个警告,如图4-3,对话 UI 没有显示
A2:
方法一:自己绘制 UI,然后添加组件 Dialogue UGUI(Script),一一将绘制的 UI 拖到相应的位置即可
方法二:利用这个场景的示例,将 Hierarchy 窗口里的 @DialogueUGUI 保存成预制,再拖到自己场景的 Hierarchy 即可(还有 EventSystem,如果自己场景没有,也需要保存成预制然后拖拽到自己场景)

五:其他技巧
留一个 FSM 的示例,大家通过以上方法来自己尝试理解噢
· 添加属于自己的注释
双击想要更改的节点,将图5-1高亮部分改成中文翻译或者其他你想修改的都可以,效果如5-2(谷歌翻译结果)


同样的,在每个节点都有可编辑的 Comments 和 Tag,在 Commects 里输入这个节点的作用可以方便记忆,如图5-3

· 菜单栏 Tools 工具
有很多可视化工具也可帮助你的开发过程,如图5-4,例如这个 Graph Explorer,另一种竖式查看根节点看法,鼠标触摸有颜色提示如图5-5


六:结语
感谢各位的观看,这也是我学习的一个笔记记录,希望对你有帮助,
如有错误还请指正,
再次感谢!