[UE5] 이득우 Part 2. 12강 행동트리 모델의 구현

공부 스파이럴·2024년 1월 29일
0

실습

  • 에디터 - 블랙보드 에셋
    • 패트롤 포지션 벡터 key 추가
    • 홈 포지션 벡터 key 추가
  • 네비게이션 메쉬 볼륨 추가
    • x, y, z 각각 10만, 10만, 1000
  • 프로젝트 세팅 - Navigation Mesh - Runtime
    • Runtime Generation을 Dynamic으로

  • 행동 트리
    • sequence
      • wait
        -> 대기 3초 (+- 1초)
      • move to
        -> 블랙보드 키를 패트롤 포지션으로

  • BTTaskNode를 상속 받은 클래스 생성
    • "NavigationSystem", "AIModule", "GameplayTasks" 모듈 추가해줘야 함

  • 전처리기 추가

  • 행동 트리를 실행하기 전 현재 위치를 홈 포지션으로 Set

  • BTTaskNode의 ExecuteTask를 오버라이드
    • BT 컴포넌트에서 pawn을 가져옴
    • pawn에서 navi system을 가져옴
    • GetRandomPointInNavigableRadius 함수를 통해 홈 포지션을 기준으로 반경으로 패트롤 포지션을 얻어옴
    • 패트롤 위치 설정

  • 캐릭터 AI 인터페이스 클래스 생성
    • NonPlayer 클래스가 상속받음

  • BTService 를 상속 받은 detect 클래스 생성
  • service 노드는 TickNode라는 함수가 지정한 인터벌로 계속해서 실행
  • 노드 이름과 인터벌 설정
  • TickNode
    • 충돌 감지 -> 타겟 설정

  • 행동 트리 노드
루트
  - 셀렉터
    - 셀렉터 + 데코레이터(블랙보드)-> 키:타겟
    - 시퀀스 + 데코레이터(블랙보드)-> 키:타겟, 아닐 때
      + On Value Change, abort:self
      + detect 서비스

  • Attack 범위 데코레이터와 attack task 클래스 생성
루트
  - 셀렉터
    - 타겟 셀렉터
      - 셀렉터 + 데코-> attack 범위
        - attack task
      - 셀렉터 + 데코-> attack 범위 inverse condition
        + abort: both
        - move to

  • attack 범위 데코레이터
    • CalculateRawConditionValue 오버라이드
    • 노드 이름 설정

  • attack task
    • interface를 통해서 공격 명령을 내림
    • interface에 공격 명령 함수 추가
    • 공격은 몽타주가 끝나야 공격이 끝났다라고 할 수 있음
    • 명령을 내렸다고 해서 성공이라 할 수 없음
      -> EBTNodeResult::InProgress 를 반환
  • interface에 델리게이트 선언
    -> 공격이 끝났는지 확인
  • 공격이 끝나는 것을 파악하기 위한 함수에 몽타주가 있어서 사용하기 어려움
    • 다른 함수 만들어줌(가상 함수)
    • 공격이 끝날 때 호출하도록 함
    • NPC에서 오버라이드해서 델리게이트 호출
  • attack task
    • attack 명령을 호출하기 전에 델리게이트 바인딩
    • FinishLatentTask를 통해 마무리됐다고 알려줌

  • target 셀렉터에도 detect를 붙여주면 플레이어가 죽었을 때 target이 null이 되서 공격을 멈춤

  • 공격할 때 플레이어 바라보게 설정할 task node 추가
  • selector 를 simple parallel로 변경
    • 메인을 attack
    • 서브를 turn

0개의 댓글