(유니티) Behavior Tree (BT)

티원·2025년 11월 19일

디자인패턴

목록 보기
16/16

BT 시연 영상
FSM이란?
상태패턴?
Behavior Tree란?
구현 난이도 : FSM < 상태패턴 < BT
구조 복잡할수록 효율 : FSM < 상태패턴 < BT

사용 방법

  • 코드에서 Behavior Tree를 하는 방법과 유니티에서 제공하는 Behavior Graph를 이용하는 방법이 있다.
  • 그림판키고 어떻게할지 그림을 구성을 그리면서 하는게 좋다. Behavior Tree의 조건

사용 방법1 (유니티 Behavior Graph)

유니티공식문서 - Behavior Graph
사용법 요약 : 그래프 생성하고, 게임오브젝트에 Behavior Agent 컴포넌트 추가후 그래프 끌어놓고 파라미터값 설정, 이후 생성된 cs파일을 수정하여 상태를 변경시키며 사용하면 된다

그래프 작성법


실습 영상 보면서 천천히 파악해보기

  1. 원하는 도형 선택해서 도식화와 blackBoard 파라미터 설정
    패키지매니저 - Behavior Install, Hierachy 마우스우클릭 - Create - Behavior - Behavior Graph
    만들어진 Behavior Graph를 이용해서 도식도를 만든다
    Selector -> Try In Order
    Sequence -> Sequence
    Action -> Create New - Action (이름지정 - 이후 코드로 작성 예시) Self Detect Player with detectRange -> 파라미터로 쓸 단어는 파라미터 설정 (그림참조)
    Action을 만들어주면 cs파일이 자동으로 생성된다
    Action과 연결하는 파라미터는 blackBoard에 파라미터 설정해서 Action과 연결해준다

  2. 하려는 Object에 Behavior Agent 컴포넌트 추가 후 Behavior Graph와 연결, 파라미터 설정

  3. 1번에서 Action으로 만들어준 cs파일을 수정, 실습할때는 OnUpdate를 수정했었음
    로직 코드를 넣고 상태에 따라 다르게 State를 변경한다
    *주의할점: 외부에서 받아온 필드들 (SerializeReference가 있는것들)은 .Value를 붙여서 사용해야한다
    병렬에서는 Run in Parallel 이라는 것을 만들어서 자리에 넣으면 됨

사용 방법2 (코드로)

코드가 너무 길어서 시연영상 있는 곳에 코드 첨부해둠 (벨로그는 접기기능이 없다)
각 노드별 설명은 아래 개념 설명 참조
중요한 것은 위의 그래프 도식도 그림처럼 흐름대로 어떨때 어떤 행동을 한다 라는 것과
Sequence Node 에는 조건을 판단하는 Condition, 행동을 하는 Action 노드가 있다는점이 중요
Condition Node : 어떤 것을 할지 판단하는 노드. 판단하는 코드
Action Node : 거의 무조건 Run을 반환하는 노드, 실행에 대한 코드

예시) 아래경우 병렬처리 하면 된다
거리내에 플레이어 있으면 따라감 -> Condition: 거리내에 확인, Action : 따라간다
거리내에 적이 있으면 총알쏜다 -> Condition: 거리내에 확인, Action 총쏜다'

쓰는 이유

  • 적이 플레이어를 감지하고 쫒아와서 공격하는 것을 넘어, 복잡한 수준의 행동이 필요한 경우 상태패턴으로는 매우 관리가 복잡하고 힘들어질 수 있다.
  • 기획자와 대화하기 위한 자료로 도식화를 하기에도 FSM으로는 쉽지않다
    이런 경우 게임AI에 도입할 수 있는 Behavior Tree

장점

  • 자료구조 Tree 기반으로 행동을 위한 과정들이 계층적으로 분리되기 때문에 도식화하기 간편
  • 추후 디버깅이나 행동에 대한 기준을 수정할 때도 쉽게 적용

단점

  • 초기 구성이 어렵다

개념

  1. Tick (틱) : 루트노드가 매 프레임(또는 지정주기)마다 현재 행동을 판단하기위해 호출, 트리전체를 한번 평가한다. 유니티 Update문 처럼

    • 루트 -> 리프 방향으로 하향 전파, 각 컴포지트 노드(복합 노드)는 자식 노드의 반환값(Success/Failure/Running)에 따라 다음 자식에게 틱을 넘길지, 상위로 결과를 반환할지 판단
    • 노드가 Running을 반환하면 같은 노드가 다음 틱에서 다시 호출되어 작업을 이어감
  2. Node (노드) : 노드구조로 동작 (트리니까)

    • 작업(Action)또는 조건 판단(Condition)을 수행하는 단위
    • 틱이 도착하면 자신의 로직을 수행하고 결과를 부모에게 반환 (Success : 조건 충족, Failure : 조건 실패, Running : 진행중, 다음 틱에서 재평가)
    • Condition 노드는 Success/ Failure만 반환, Action노드가 장기 작업 시 Running 반환
  3. Composite Node (복합 노드)
    자식 노드들의 실행 흐름을 제어
    - Sequence (시퀀스) : And개념, 하나라도 Success가 아니라면 즉시 반환, Failure라면 즉시 중단, Running이라면 Running반환 후 다음틱에서 다시 호출, 모두 Success 라면 Success반환
    - Selector (셀렉터) : OR개념 , 하나라도 Success나 Running이라면 상태 반환, 모두 Failure여야 Failure 반환
    - Parallel (병렬) : 무조건 다 실행, 자식 노드를 모두 실행한 뒤 결과반환 (조건은 설정에 따라 달라짐)

  4. Decorator Node (데코레이터 노드)
    하나의 자식 노드를 가지며, 자식의 실행 조건이나 결과 변경
    - Inverter (인버터) : Success와 Failure 반전, Running은 유지
    - Succeeder : 항상 Success 반환
    - Repeater : 자식 노드를 원하는 횟수만큼 반복 실행
    - Until Fail : 자식이 Failure를 반환할때까지 반복 실행
    - Until Success : 자식이 Success를 반환할때까지 반복 실행
    - Condition Decorator : 특정 조건이 True일때만 자식 노드를 실행

  5. Leaf Node (리프노드)
    트리의 가장 하위 노드로 자식을 가지지 않는다
    실제 행동을 수행하거나 조건 판단
    - Action : 구체적인 행동을 수행, Success/Failure/Running 반환
    - Condition : 특정 상태나 환경 판단, 보통 Success / Failure 반환

0개의 댓글