Behavior Designer文档-10(变量)

本节包含四部分内容,以下是目录:

      1,变量概述

      2,设置全局变量

      3,自定义共享变量

      4,非任务节点类访问行为树中的变量

备注:共享变量就是全局变量,文档作者希望突出全局变量的功能,取名为共享变量shared,但是设置变量时面板显示的是全局变量Global

以下是内容:


1,变量概述


      行为树其中一个优秀的特性是:低耦合,这样每个任务都不需要依赖其他任务去运行。但是低耦合的缺点就是任务节点之间很难进行信息传递,例如,有一个条件任务判断目标对象是否处于可视区域,如果目标处于可视区域就运行动作任务,让主角靠近目标对象,条件任务和动作任务这个时候需要共享一个变量:目标对象。在传统的行为树中是编写一个黑板模块来解决这个问题,在行为树设计师插件中有更加简单的方法来解决,就是在行为树设计师插件提供的变量面板中直接编写变量。

      在刚才的例子中我们提到两个任务:其中一个条件任务判断目标对象是否处于可视范围,另外一个动作任务让主角靠近目标对象,请看下图:

Behavior Designer文档-10(变量)_第1张图片

      详细代码请参考前面章节:创建任务。本节内容我们将讲解其中使用的共享变量,在条件任务和动作任务中申明一个共享变量是:

public SharedTransform target;

       在变量面板(Variables)中创建一个全局变量(Global Variables),变量名Target,类型transform:

      拖动目标对象到None上。

       切换到inspector面板,把全局变量分配给target(刚才建立的共享变量)。

      这样两个任务现在可以这样共享信息:在属性中选择刚才建立的全局变量。这样操作后,target的值将返回目标对象的位置,当条件任务运行的时候将记录目标对象的位置信息,当动作任务运行的时候将读取之前设置的位置信息。


      在下图的inspector面板中,Position右边靠近×的一个三角形符号,是一个变量映射按钮:

Behavior Designer文档-10(变量)_第2张图片

     变量映射允许你共享相同类型的属性,你可以通过这个快速的获得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);


你可能感兴趣的:(Behavior Designer文档-10(变量))