본문 바로가기

유니티

[Behavior Designer] 09 . 변수

[shared variable]

[shared variable의 필요성]

=>BT의 장점은 Task 간의 연결이 느슨하여 유연하다는 점이다.즉 , 하나의 Task는 다른 Task에 의존하지 않는다.

그러나 정보를 공유하는 작업이 필요할때가 있다 . 기존의 Behavior Tree는 Black Board를 활용하여 이 문제를 해결

했지만 Behavior Manager 에셋은 shared variable(공유 변수)를 통해 해당 문제를 해결하였다.

 

[shared variable]

public SharedTransform target;

=>앞서 시야각 안에 있는 대상을 쫒는 BT에서 공유 변수를 선언했다.

=>해당 변수의 선언으로 Behavior Designer에서 변수를 생성하고 적용할 수 있다.

=>이제 두 Task는 서로의 정보를 공유 할 수 있다.

Transform transformValue = target.Value;

=>또한 value에 접근하여 해당 shared variable의 값을 가져오거나 , 설정이 가능하다.

 

[변수 매핑]

=>변수 옆 삼각형 버튼으로 Shared Variable을 동일한 유형의 property에 매핑 할 수 있다.

매핑한다면 변수값에 접근할때마다 매핑된 property를 사용한다.

public class MyMonoBehaviour : MonoBehaviour
{
   private Vector3 m_MyVector3;
    // Required for property mappings.
   public Vector3 MyVector3 { get { return m_MyVector3; } set { m_MyVector3 = value; } }
}

=>접근시 c#property를 필요로 하며 c#field에 대한 직접접근은 작동하지 않는다

 

[Shared Variable 유형]

=>Behavior Manager 에셋 포함된 것들이며 고유한 Shared Variable 역시 만들 수 있다.

=>유형

  • SharedAnimationCurve
  • SharedBool
  • SharedColor
  • SharedFloat
  • SharedGameObject
  • SharedGameObjectList
  • SharedInt
  • SharedMaterial
  • SharedObject
  • SharedObjectList
  • SharedQuaternion
  • SharedRect
  • SharedString
  • SharedTransform
  • SharedTransformList
  • SharedVector2
  • SharedVector3Int
  • SharedVector3
  • SharedVector3Int
  • SharedVector4

[그 외 특징]

=>전역/지역 변수 모두 지원하며 ,전역변수는 트리가 동일한 변수를 참조 할 수 있다는 점을 제외하면

지역변수와 유사하다.

=>Task가 아닌 클래스는 BT로 부터 참조를 얻어와 변수참조가 가능하다.

 

[Shared variable 생성하기]

[Shared variables]

=>원하는 타입이없다면 Shared variables를 직접 만들 수도 있다.

[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 }; }
}

=>중요한 것은 "Value" 프로퍼티가 존재해야 한다는 점이다. 잘못 생성되었다면 variable inspector가 오류를 알려 줄 것.

공유변수는 Primitive ,배열,리스트 ,커스텀 오브젝트 등 Task가 포함 가능한 오브젝트를 포함 가능하다.

[Dynamic Variables]

[Dynamic variables]

=>Dynamic variables범위가 제한된 임시 변수이다.제한된 수의 Task 간에 데이터를 공유하고 , Taks들 외부에서

해당 변수에 접근 할 필요가 없을때 사용한다.

=>Dynamic variables는 회색 버튼 - Dynamic   선택 의 과정을 거쳐 생성 할 수 있다. 

=>Dynamic variables의 이름을 참조하는 필드에 대해 모두 동일한 값을 가지며 , 대소문자를 구분하며 트리 내부의

로컬 변수와 이름이 동일해서는 안된다.

 

[Global Variables]

[Global variables]

=>Global variables는 BT가 동일한 변수의 인스턴스에 액세스할 수 있다는 점을 제외하면 지역 변수와 유사하다.

전역 변수에 액세스하려면 Window->Behavior Designer->Global Variables 메뉴 옵션으로 이동하거나 Variables 창에서 

생성,확인이 가능하다

=>Global variables가 처음 추가되면 모든 전역변수를 저장하는 에셋파일이

 /Behavior Designer/Resources/BehaviorDesignerGlobalVariables.asset.의 경로에 생성된다.

리소시스 폴더에 있는한 다른 폴더로 이동이 가능하다.

=>지역변수와 같이 사용이 가능하며 , Task가 아닌 개체에서도 엑세스가 가능하다.

[Non-Task에서 변수에 접근하기]

[변수접근]

=>변수는 대게 Behavior Designer의 inspector panel의 변수 이름을 할당 하여 참조된다. 

지역변수는 다음 메서드의 호출로 Non-Task(MonoBeahavior등)에서 접근이 가능하다.

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;
   }
}

=>이처럼 접근이 가능하며 Value 프로퍼티로 값의 설정 역시 가능하다.

 

[Global Variable접근]

=>Global variable도 비슷한 방식으로 접근한다.

GlobalVariables.Instance.GetVariable("MyVariable");
GlobalVariables.Instance.SetVariable("MyVariable", value);

 

 

 

출처