[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);
출처
'유니티' 카테고리의 다른 글
[유니티] Scene 격자 색상 변경 (0) | 2023.02.07 |
---|---|
[유니티] Line Renderer 로 움직이는 오브젝트를 연결하기 (0) | 2023.01.25 |
[Behavior Designer] 08 . 디버깅 (0) | 2023.01.18 |
[Behavior Designer] 07 . 시야각에 있다면 쫓아가는 BT (0) | 2023.01.18 |
[Behavior Designer] 06 . PARENT TASKS (0) | 2023.01.18 |