本节包含四部分内容,以下是目录:
1,变量概述
2,设置全局变量
3,自定义共享变量
4,非任务节点类访问行为树中的变量
备注:共享变量就是全局变量,文档作者希望突出全局变量的功能,取名为共享变量shared,但是设置变量时面板显示的是全局变量Global
以下是内容:
1,变量概述
行为树其中一个优秀的特性是:低耦合,这样每个任务都不需要依赖其他任务去运行。但是低耦合的缺点就是任务节点之间很难进行信息传递,例如,有一个条件任务判断目标对象是否处于可视区域,如果目标处于可视区域就运行动作任务,让主角靠近目标对象,条件任务和动作任务这个时候需要共享一个变量:目标对象。在传统的行为树中是编写一个黑板模块来解决这个问题,在行为树设计师插件中有更加简单的方法来解决,就是在行为树设计师插件提供的变量面板中直接编写变量。
在刚才的例子中我们提到两个任务:其中一个条件任务判断目标对象是否处于可视范围,另外一个动作任务让主角靠近目标对象,请看下图:
详细代码请参考前面章节:创建任务。本节内容我们将讲解其中使用的共享变量,在条件任务和动作任务中申明一个共享变量是:
public SharedTransform target;
在变量面板(Variables)中创建一个全局变量(Global Variables),变量名Target,类型transform:
拖动目标对象到None上。
切换到inspector面板,把全局变量分配给target(刚才建立的共享变量)。
这样两个任务现在可以这样共享信息:在属性中选择刚才建立的全局变量。这样操作后,target的值将返回目标对象的位置,当条件任务运行的时候将记录目标对象的位置信息,当动作任务运行的时候将读取之前设置的位置信息。
在下图的inspector面板中,Position右边靠近×的一个三角形符号,是一个变量映射按钮:
变量映射允许你共享相同类型的属性,你可以通过这个快速的获得unity中gameobject的组件属性。例如,在unity中有一个gameobject名字是Agent,我们想要获得它的transform的postion属性,点击三角形,找到相应的属性就可以了,如上图所示。这样你设置了agent的位置属性就不需要增加额外的任务节点了。
行为树设计师插件支持局部和全局变量,全局变量和局部变量唯一不同就是全局变量是所有任务节点共享的。两种变量都可以被非任务节点的类引用,如何引用请参考以后章节-引用行为树信息(getting a refernce)。
下面列举了行为树设计师插件预制的一些共享变量类型,如果预制的变量不能满足你的需求,你可以自己创建一个,如何创建请参考以后章节-自定义共享变量,下面是预制列表:
SharedBool SharedColor SharedFloat SharedGameObject SharedGameObjectList SharedInt SharedMaterial SharedObject SharedObjectList SharedQuaternion SharedRect SharedString SharedTransform SharedTransformList SharedVector2 SharedVector3 SharedVector4
2,全局变量
全局变量是行为树中所有任务都可以使用的变量。设置一个全局变量,可以使用以下路径:
Window->Behavior Designer->Global Variables
或者可以在插件左侧Variables面板中设置。
当添加一个全局变量以后,系统会生成一个相应的资源文件,这个资源文件储存了所有的全局变量值。这个资源文件默认生成在:/Behavior Designer/Resources/BehaviorDesignerGlobalVariables.asset,你可以移动这个资源,但是必须在Resources目录中。
可以使用相同的方法去分配全局变量和局部变量:在inspector面板中,全局变量都在集中在Globals选项中,如图:
3,自定义共享变量
如果你希望使用预制里面没有的共享变量(就是全局变量),你可以自己定义一个。创建自定义共享变量需要继承SharedVariable类,然后实现以下方法:(关键词<OBJECT_TYPE>需要被替换成你需要的类型)
[System.Serializable] public class SharedOBJECT_TYPE : SharedVariable < OBJECT_TYPE > { public static implicit operator SharedOBJECT_TYPE(OBJECT_TYPE value) { return new SharedOBJECT_TYPE { Value = value }; } }
上面这个类最重要的是“Value”属性。如果共享变量创建错误,variable面板会出现错误提示。共享变量可以包含任何对象类型,包括:arrays,lists,单个变量,自定义类等。
下面一个例子将把一个自定义类作为共享变量:
[System.Serializable] //定义一个类 public class CustomClass { public int myInt; public Object myObject; } //把自定义类作为共享变量 [System.Serializable] public class SharedCustomClass : SharedVariable < CustomClass > { public static implicit operator SharedCustomClass(CustomClass value) { return new SharedCustomClass { Value = value }; } }
4,非任务节点类访问行为树中的变量
在行为树设计师插件的inspector面板中设置的变量,可以被非任务节点的类正常的引用。局部变量(单个任务节点的变量)可以在继承MonoBehaviour的类中使用以下方法引用:
behaviorTree.GetVariable("MyVariable"); behaviorTree.SetVariable("MyVariable", value); behaviorTree.SetVariableValue("MyVariableName", value);
在设置变量的时候,如果你想要变量引用成功,需要提前设置好变量的名称。下面的代码片段是非任务节点类改变任务节点中变量的值的例子:
using UnityEngine; using BehaviorDesigner.Runtime; public class AccessVariable : MonoBehaviour { public BehaviorTree behaviorTree; public void Start() { var myIntVariable = (SharedInt)behaviorTree.GetVariable("MyVariable"); myIntVariable.Value = 42; } }
上面的代码中引用了一个名叫“MyVariable”的变量,这个变量是在行为树设计师插件的面板中设置的,在代码中你可以获得和设置变量的值。
同样的,限免的例子是教你如何获取全局变量:
GlobalVariables.Instance.GetVariable("MyVariable"); GlobalVariables.Instance.SetVariable("MyVariable", value);