[UE4] AI Controller를 사용한 AI구현

윤정민·2023년 1월 28일
0

Unreal Engine

목록 보기
22/34

1. AI Controller

1) 캐릭터의 빙의

언리얼 엔진에서 캐릭터는 controller의 지배를 받는다. 이를 빙의(Poss)라고 부른다.

(1) Player Character의 빙의

player character가 만들어지게 되면 player controller가 종속적으로 만들어지게 되고 player character는 player controller에 빙의 된다. 그 후 player의 keydown에 따라 설정된 함수가 실행된다.

*참고: player character와 player controller 등은 GameMode에서 설정할 수 있다.

(2) AI Character의 빙의

AI Character도 마찬가지로 AI Controller의 지배를 받게 된다. AI의 행동은 BehavierTree에 의해 결정된다.

*참고: AI Controller는 AI Character 생성자에서 설정할 수 있다.
  • Controller 설정 (AICharacter::AICharacter())
    AIControllerClass = AMainEnemyAIController::StaticClass();
    AutoPossessAI = EAutoPossessAI::PlacedInWorldOrSpawned;
    • AIControllerClass를 MainEnemyAIController로 설정
    • 빙의하는 Character를 월드에 배치되거나 스폰되는 Character로 설정
*참고: Behavior Tree는 AI Controller의 OnPossess()에서 설정할 수 있다.
  • Behavior Tree 찾아오기(MyAIController::MyAIController())
    static ConstructorHelpers::FObjectFinder<UBlackboardData> BBObject(TEXT("BlackboardData'/Game/AMyDirectory/Enemy/AI/BB_MainEnemy.BB_MainEnemy'"));
    if (BBObject.Succeeded())
    {
        BBAsset = BBObject.Object;
    }
  • Behavior Tree 설정(MyAIController::OnPossess(APawn* InPawn))
    if (!RunBehaviorTree(BTAsset))
    {
        UE_LOG(LogTemp,Error, TEXT("AIController couldn't run behavior tree!"));
    }
    • 설정 faile시 log출력

AiController에서 움직임 관련 함수(MoveTo 계열)을 사용하게되면 해당 위치까지의 길을 찾아 움직이게 된다. 즉, 방해물을 돌아서 간다는 뜻이다. 이러한 기능을 위해 Level에 NavMeshBoundsVolume가 navigation원하는 위치에 있도록 설정해주어야 한다.('P'키를 눌러 확인가능)

2. Black Board

Behavior Tree에서 사용할 변수를 저장하는 역할을 한다. 보통 AIController class와 연동해서 값 제어한다.

*참고: AIController의 변수와 연동
  • BlackBoard 변수
  • class에 변수 선언(MyAIController.h)
    public:
        static const FName HomePosKey;
        static const FName PatrolPosKey;
        static const FName TargetKey;
        static const FName CanSeePlayerKey;
  • 변수 연동(MyAIController.cpp)
    const FName AMainEnemyAIController::HomePosKey(TEXT("HomePos"));
    const FName AMainEnemyAIController::PatrolPosKey(TEXT("PatrolPos"));
    const FName AMainEnemyAIController::TargetKey(TEXT("Target"));
    const FName AMainEnemyAIController::CanSeePlayerKey(TEXT("CanSeePlayer"));

3. Behavior Tree

AICharacter의 행동을 판단한다.

1) 언리얼 Behavior Tree 특징

(1) 이벤트 주도형 Behavior Tree

언리얼엔진의 Behavior Tree와 전통적인 Behavior Tree와 달리 이벤트로 주도되기 때문에 프레임 마다 불필요한 작업이 수행되지않는다.

(2) 병렬 노드

언리얼엔진의 Behavior Tree는 단순 병렬, 서비스, 데코레이터를 사용하여 동일한 유현의 행동을 달성한다.
2

2) Node Type

(1) Root

해당 트리의 고유한 트리로 몇가지 특별한 규칙을 가진다.

  • 하나의 연결만 가질 수 있음
  • Decorator Node or Service Node의 Attach를 지원하지 않음
  • 프로퍼티를 가지지 않음

(2) Composite

분기의 루트와 해당 분기가 실행되는 방식의 기본 규칙을 정의한다.

  • Selector

    • 왼쪽에서 오른쪽 순서로 자손을 실행
    • 자손 중 하나가 성공하면 실행을 중단
    • 자손이 하나라도 성공하면 셀렉터도 성공, 자손이 모두 실패하면 셀렉터도 실패
    • property
      • Decorator 영역 적용: 활성화하면 실행 흐름이 분기를 떠날 때 아래 분기의 모든 데코레이터를 제거, 현재 노드의 데코레이터는 영향을 받지 않음
      • Node Name: Behavior Tree Graph에 표시되는 노드 이름
  • Sequence

    • 왼쪽에서 오른쪽 순서로 자손을 실행
    • 자손 중 하나가 실패하면 실행을 중단
    • 자손이 하나라도 실패하면 시퀀스도 실패, 자손이 모두 성공해야 시퀀스도 성공
    • property
      • Decorator 영역 적용: 활성화하면 실행 흐름이 분기를 떠날 때 아래 분기의 모든 데코레이터를 제거, 현재 노드의 데코레이터는 영향을 받지 않음
      • Node Name: Behavior Tree Graph에 표시되는 노드 이름
  • Simple Parallel

    • 메인 태스크 노드 하나를 전체 트리와 함께 실행
    • 메인 태스크가 완료되면 모드 완료 세팅에 따라 보조 트리를 중단하고 즉시 완료되거나, 보조 트리가 완료될 때 까지 대기
    • property
      • 완료 모드(Finish Mode)
        • Immediate: 메인 태스크가 완료된 후 백그라운드 트리를 중단
        • Delayed: 메인 태스크가 완료된 후 백그라운드 트리가 완료될 때 까지 대기
      • Node Name: Behavior Tree Graph에 표시되는 노드 이름

(3) Task

실행할 수 있는 액션을 나타내며, 출력 연결을 갖지 않는다.

(4) Decorator

다른 노드에 Attach되어 트리의 분기나 단일 노드의 실행여부를 결정한다.

  • Blackboard
    • 특정 블랙보드 키에 값이 설정되어 있는지 확인
    • property
      • Notify Observer
        • On Result Change: 조건이 변경되었을 때마다 재시작
        • On Value Change: 관찰되는 블랙보드 값이 바뀔 때마다 재시작
      • Observer Aborts
        • None: 아무것도 중단하지 않음
        • Self: 자신과 이 노드 아래 실행중인 서브 트리도 중단
        • Lower Priority: 이 노드의 오른쪽에 있는 모든 노드를 중단
        • Both: 자신, 그 아래 실행중인 서브 트리, 이 노드 오른쪽에 있있는 모든 노드를 중단
      • Blackboard Key: 데코레이터가 작업할 블랙보드 키
      • Key Query
        • Is Set: 값이 설정되었는지 여부
        • Is Not Set: 값이 설정되지 않았는지 여부
      • Node Name: Behavior Tree Graph에 표시되는 노드 이름

(5) Service

Composite Nodes에 Attach되며, 자신의 분기가 실행되는 동안에 한해 정의된 주기로 실행된다. 보통 블랙보드의 확인 및 업데이트에 사용되며, 전통적인 비헤이비어 트리의 병렬 노드를 대체한다.

profile
그냥 하자

0개의 댓글