Bolt介绍

unity Bolt原理 unity3d bolt_Machine

前言:想实现类似橙光游戏、互动视频的效果。如果用代码编写,过多的分支节点会难以管理,如果有类似虚幻蓝图的可视化编程方式将极大方便工作开展。先是找到PlayerMaker插件,觉得编写有局限性较大。而后找到Bolt插件,发现符合需求,自由度够高。

0 插件介绍

2018年Ludiq开发商开发Bolt可视化编程插件,最初售价70美元。2020年Unity Technologies收购了该插件,并免费开放给用户使用。

Ludiq网站:

Bolt官方文档:https://docs.unity3d.com/bolt/1.4/manual/index.html

0.0 视频教程

unity Bolt原理 unity3d bolt_Machine_02

  1. 教程介绍及准备:Bolt安装及设置。
  2. 实现基本的人物移动:节点、变量的基本用法。
  3. 跳跃-地面检测-动画-Gizmos:多个宏嵌套。
  4. 场景加载-数据保存:Custom Event创建使用,系统数据存储。
  5. HUD-获得钥匙开门:Application Variable使用。
  6. 人物血量更新及状态切换:For循环使用,State Machine使用,协程使用。
  7. 短暂无敌-敌人AI巡逻:状态机(State Machine)构建。
  8. 敌人追击AI:状态机(State Machine)的切换。
  9. 玩家投掷 - 敌人死亡
  10. 制作菜单及UI互动:C#代码配合Bolt使用。

1 基本配置

1.1 插件导入

从Asset Store搜索Bolt,导入插件。

unity Bolt原理 unity3d bolt_游戏_03

unity Bolt原理 unity3d bolt_ue4_04

点击Tools》Install Bolt,等待插件安装。

unity Bolt原理 unity3d bolt_unity_05

点Next进入导向,模块命名方式有两种,程序员选Programmer Naming,符合编程习惯,非程序员选另一个,模块命名更像人话。

unity Bolt原理 unity3d bolt_ue4_06

unity Bolt原理 unity3d bolt_unity Bolt原理_07

啥都不用改,点Next继续,点Generate等待执行完毕,插件配置结束。

unity Bolt原理 unity3d bolt_Machine_08

unity Bolt原理 unity3d bolt_ue4_09

1.2 界面布局

为方便编程,要把常用窗口调出来。先在Layout中将布局设置回默认状态。

unity Bolt原理 unity3d bolt_Machine_10

菜单栏Window,分别调出Graph(蓝图编辑窗口),Graph Inspector(组件属性编辑窗口),Variables(变量创建窗口)。拖到如图对应位置,在Layout中保存该布局,命名为Bolt,方便以后使用。

unity Bolt原理 unity3d bolt_unity Bolt原理_11

unity Bolt原理 unity3d bolt_游戏_12

2 插件说明

介绍一些概念。

2.1 蓝图

插件可以创建两种蓝图进行可视化编程,分别是Flow Machine和State Machine。

unity Bolt原理 unity3d bolt_ue4_13

  • Flow Machine:流程机。编写的逻辑会一步步从前往后运行,和写代码一样,一行行往下运行。一个Flow Machine里可以有多个Flow Machine,也就是套娃,类比代码里一个方法可以调用很多其他方法。
  • State Machine:状态机。参考Unity里的动画状态机,运行时会从一个状态开始,满足一定条件会跳到另一个状态。一般配合Flow Machine使用,一个状态就是一个Flow Machine。

蓝图有两种模式,Embed和Macros。

unity Bolt原理 unity3d bolt_游戏_14

  • Embed:内嵌模式。独立存在,只有一个。
  • Macro:宏模式。类似模板,可以复用。

它两的区别是,内嵌模式可以将场景中已经存在的物体直接拖进蓝图中参与处理(参考已经挂载到物体上的脚本,如果其中定义了公开变量(public),可以通过直接拖拽场景中的物件对这个变量赋值),相比宏模式不支持这个操作。

这里我第一次用的时候就很迷惑,发现场景中的物体不能拖进来使用,因为像C#脚本挂载到物体上后就是可以对Public变量赋值的,后来才发现要转Embed模式。其实它这么设计也有一定用处,就是当你再改模板的时候,你转为Embed模式的蓝图不会受到影响。但是Macro模式为什么不能拖物体这里就有点奇怪,因为写C#脚本跟这个Macro模式是一样的,就是写一个可以复用的模板,而它挂载到物体上就是实例化了这个脚本,是可以使用场景中的物体来对变量赋值的。

2.2 变量

数据格式类型,像整形、浮点型、布尔型等,该有的都有,也没啥好说的。

主要是数据管理类型,分为Graph、Object、Scene、App和Saved。

unity Bolt原理 unity3d bolt_Machine_15

  • Graph:只在当前蓝图内可以使用。相当于代码里的私有变量(private)。
  • Object:当前物体上挂载的其他蓝图也可以使用。
  • Scene:当前场景内都可以使用,跳转到其他场景后不能使用。
  • Application:任意场景均可以使用,程序结束并再次运行时,变量恢复初始化。
  • Saved:同App,但程序再次运行会保留之前的数据,用于存储成长性的数据(如玩家金币数等)。

3 插件使用

这里简单实现一个按钮点击后,产生其他新按钮的效果(类似互动视频、橙光游戏的效果)。

unity Bolt原理 unity3d bolt_unity_16

我当时做项目的思路是在Canvas下生成Button,并用Layout Group进行自动排列。

Canvas上挂载蓝图状态机,并设置一个整形变量以确定跳转的分支点,设置布尔型变量以触发分支跳转。

Button做一个预制体,这个预制体在点击后按钮会修改Canvas中分支变量和跳转触发变量,以实现分支的跳转。

最后效果是实现了,但是每次添加分支还要手动设置一下分支号,感觉设计的还是不够合理。

待更新。。。

懒了,先不写了,有可能也会停更。