구매 사이트
옵시브 비헤비어 디자이너 공식 문서
https://opsive.com/support/documentation/behavior-designer/overview/
비헤비어트리를 적용하는 법
CreateTree.cs를 하나로 만들었다고 생각하고 예시로 들겠습니다.
using UnityEngine;
using BehaviorDesigner.Runtime;
public class CreateTree : MonoBehaviour
{
public ExternalBehaviorTree behaviorTree;
private void Start()
{
var bt = gameObject.AddComponent<BehaviorTree>();
bt.StartWhenEnabled = false;
bt.ExternalBehavior = behaviorTree;
}
}
보다시피 Behavior Tree 컴포넌트를 bt 오브젝트에 붙여줍니다.
StartWhenEnabled를 false로 바꿔서 생성하자마자 작동하지 않도록 해주면됩니다.
그리고 ExternalBehaviour부분에 우리가 주고 싶은 특정 트리를 지정하면됩니다.
Behavior Manager
그리고 Behavior Manager가 없으면 자동 생성이 되는데,
해당 컴포넌트는 씬에 존재하는 모든 비헤이비어 트리의 실행을 관리합니다.
틱은 우리가 본 트리 전체의 Task들을 1틱당 모두 다 실행합니다.
만약 Repeater로 5번 반복한다면 단일 틱당 5번을 모두 실행합니다.
틱 실행 단위(Update Interval)를 아래와 같이 설정 가능합니다.
매 프레임(update) | Every Frame |
매 초 | Specify Seconds |
직접 호출 | Manual |
또는 아래 코드처럼 원할 때 실행을 하는 Manual로 수동으로 틱 실행이 가능합니다.
BehaviorManager.instance.Tick(); // 모든 트리를 틱
BehaviorManager.instance.Tick(BehaviorTree); // 특정 트리를 틱
비헤비어트리를 상속한 Task들은 MonoBehaviour상속한거랑 비슷하게 고유의 수명주기를 가집니다.
// OnAwake는 비헤이비어 트리가 활성화될 때 한 번 호출됩니다.
// 생성자와 같은 방식으로 생각하면 됩니다.
void OnAwake();
// OnStart는 실행 직전에 호출됩니다.
// 이전 실행에서 재설정해야 하는 모든 변수를 설정하는 데 사용됩니다.
void OnStart();
// OnUpdate는 실제 태스크를 실행합니다.
// TaskStatus는 OnUpdate 내에서 반환되어야 합니다.
TaskStatus OnUpdate();
// OnFixedUpdate는 FixedUpdate 루프 중에 실행됩니다.
void OnFixedUpdate();
// OnEnd는 태스크가 성공하거나 실패해서 실행이 끝났을 때 호출됩니다.
void OnEnd();
// OnPause는 비헤이비어가 일시 중지되거나 다시 시작될 때 호출됩니다.
void OnPause(bool paused);
// 프라이오리티 셀렉터(Priority Selector, 우선 순위 셀렉터)에서 사용하는
// 태스크의 우선 순위를 반환합니다.
float GetPriority();
// 유틸리티 이론(Utility Theory)용 유틸리티 셀렉터(Utility Selector)에서 사용하는
// 태스크의 유틸리티를 반환합니다.
float GetUtility();
// OnBehaviorComplete는 비헤이비어 트리 실행이 완료된 후에 호출됩니다.
void OnBehaviorComplete();
// OnReset은 인스펙터에서 공개된 프로퍼티를 수정할 때 호출됩니다.
void OnReset();
// OnDrawGizmos가 태스크에서 호출되도록 허용합니다.
void OnDrawGizmos();
// 이 태스크를 소유하는 비헤이비어에 대한 참조를 유지합니다.
Behavior Owner;
여기서 중요한건 OnEnd()는 Task가 끝난거지 트리가 끝난게 아닙니다.
트리 자체가 끝날 땐 OnBehaviorComplete()를 호출합니다.
이런 수명주기로 돌아가는 Task를 더 자세히 알아봅시다.
Task에는 노출되는 속성(변수들)이 있는데,
이름(Name), 코멘트(Comment) 및 인스턴트(Instant) 이렇게 세 가지 노출된 프로퍼티가 있습니다.
상위 Task
Behavior Graph에서 우클릭하면 Task를 생성할 수 있습니다.
Task 생성시 컴포지트(Composites)랑 데코레터(Decorators)가 있는데 얘네를 상위 Task라고 합니다.
상위 Task들은 일반 Task들과 같이 생명주기도 있지만 추가적으로 쓸만한 함수들을 API로 지원합니다.
// 상위 태스크가 가질 수 있는 최대 하위 태스크의 수
// 보통 1 또는 int.MaxValue입니다.
public virtual int MaxChildren();
// 현재 태스크가 패러렐 태스크인지 판단하기 위한 bool 값입니다.
public virtual bool CanRunParallelChildren();
// 현재 활성화된 하위 태스크의 인덱스입니다.
public int CurrentChildIndex;
// 현재 활성화된 하위 태스크의 인덱스입니다.
public virtual int CurrentChildIndex();
// 현재 태스크를 실행할 수 있는지 여부를 결정하는 bool 값입니다.
public virtual bool CanExecute();
// 실행 상태에 데코레이터를 적용합니다.
public virtual TaskStatus Decorate(TaskStatus status);
// 하위 태스크의 실행과 상태를 childStatus로 상위 태스크에 알립니다.
public virtual void OnChildExecuted(TaskStatus childStatus);
// childIndex 번째의 실행되었음과 그 상태를 childStatus로 상위 태스크에 알립니다.
public virtual void OnChildExecuted(int childIndex, TaskStatus childStatus);
// 하위 태스크가 실행을 시작한 태스크를 알립니다.
public virtual void OnChildStarted();
// childIndex 번째 자식의 실행이 시작했음을 패러렐 태스크에 알립니다.
public virtual void OnChildStarted(int childIndex);
// 패러렐 태스크와 같은 일부 상위 태스크가 상태를 재정의할 수 있도록 합니다.
public virtual TaskStatus OverrideStatus(TaskStatus status);
// 인터럽트 노드가 인터럽트된 경우 상태를 무시합니다.
public virtual TaskStatus OverrideStatus();
// 조건부 중단이 트리거되었으며 하위인덱스가 재설정되어야 함을 컴포지트 태스크에 알립니다.
public virtual void OnConditionalAbort(int childIndex);
'유니티 > 에셋 소개' 카테고리의 다른 글
유니티 Hand to Hand Set 에셋 소개 (0) | 2024.11.18 |
---|---|
유니티 Unity Addressable Importer 사용법 (0) | 2024.11.16 |
유니티 Hierachy 2 에셋으로 하이어라키를 정리하자! (0) | 2023.06.26 |
Quantum Console 퀀텀 콘솔 (0) | 2023.03.26 |