AI - osy9611/ProjectPT GitHub Wiki

AI

해당 문서는 Project PT의 AI 시스템을 정리하기 위한 문서이다.

결과물

-Clipchamp-ezgif com-video-to-gif-converter (2)

AIComponent

AI 관련 초기화를 처리하는 컴포넌트이다. AI의 GAS 및 AttributeSet을 등록하고, 초기 데이터를 설정하는 역할을 수행한다.

  • AIComponent 초기화

    • GameFramewokComponentManager의 InitState를 등록하여, AI 생성 시 초기화 로직을 실행
    • HandleChangeInitState를 활용하여 AI의 GAS 시스템 및 AttributeSet를 설정
      • 주요 코드

        void UPTAIComponent::HandleChangeInitState(UGameFrameworkComponentManager* Manager, 
            FGameplayTag CurrentState, FGameplayTag DesiredState)
        {
            const FPTGameplayTags& InitTags = FPTGameplayTags::Get();
        
            // DataAvailable -> DataInitialized 단계에서 초기화 수행
            if (CurrentState == InitTags.InitState_DataAvailable && DesiredState == InitTags.InitState_DataInitialized)
            {
                APawn* Pawn = GetPawn<APawn>();
                if (!ensure(Pawn)) return;
        
                if (UPTPawnExtensionComponent* PawnExtComp = UPTPawnExtensionComponent::FindPawnExtensionComponent(Pawn))
                {
                    // AI 전용 GAS PlayerState 생성
                    APTPlayerState* PTPlayerState = GetWorld()->SpawnActor<APTPlayerState>(APTPlayerState::StaticClass());
                    if (PTPlayerState)
                    {
                        Pawn->SetPlayerState(PTPlayerState);
                        PawnExtComp->RegisterGameAbilitySystem(PTPlayerState->GetPTAbilitySystemComponent(), PTPlayerState);
        
                        // AI 능력치(AttributeSet) 초기화
                        UPTAI_AttributeSet* AttributeSet = PTPlayerState->CreateAttribute<UPTAI_AttributeSet>();
                        AttributeSet->InitAttributeSet(FString::FromInt(TableId));
                    }
        
                    // AI의 기본 컨트롤러 스폰
                    Pawn->SpawnDefaultController();
                }
            }
        }
  • GAS(Gameplay Ability System) 실행

    • GameplayTag를 입력 받아 AI가 특정 행동을 수행하도록 처리

    • 주요 코드

      void UPTAIComponent::ProcessAbility(FGameplayTag Tag)
      {
          if (APawn* Pawn = GetPawn<APawn>())
          {
              APTPlayerState* PTPlayerState = Pawn->GetPlayerState<APTPlayerState>();
              if (!PTPlayerState) return;
      
              UPTAbilitySystemComponent* ASC = PTPlayerState->GetPTAbilitySystemComponent();
              if (ASC)
              {
                  ASC->ProcessAbility(Tag);
              }
          }
      }

AIController

AI 캐릭터의 행동을 제어하는AI 컨트롤러 클래스이다. UPTAIComponent와 연동하여 AI 상태를 관리하고, Monster 데이터 테이블을 기반을 AI 설정값을 적용하였다.

  • AI 컨트롤러 초기화

    • OnPossess에서 AI가 사용하는 MonsterData를 로드하여 AI의 기본 능력치를 설정

    • MonsterData 에는 공격 범위, 시야 거리 등 AI의 행동 패턴을 결정하는 정보가 포함되어있다.

    • 주요 코드

      void APTPlayerAIController::OnPossess(APawn* InPawn)
      {
          Super::OnPossess(InPawn);
      
          AIComponent = UPTAIComponent::FindAIComponent(InPawn);
          if (AIComponent.IsValid())
          {
              APTPlayerStart* PlayerStart = AIComponent->GetPlayerStart();
              if (!PlayerStart) return;
      
              SearchRadius = PlayerStart->Radius;
      
              if (UseTableData)
              {
                  if (UDataManagerSubsystem* DataManager = GetWorld()->GetGameInstance()->GetSubsystem<UDataManagerSubsystem>())
                  {
                      // 몬스터 테이블 데이터에서 정보 로드
                      FMonsterData* MonsterData = DataManager->FindData<FMonsterData>(FString::FromInt(PlayerStart->TableId));
      
                      DefaultAttackRange = MonsterData->DefaultAttackRange;
      
                      RegisterSightConfig(MonsterData);
                  }
              }
          }
      }
  • AI 시야 감지 설정

    • MonsterData의 감지 범위를 기반으로 AI의 시야 반경을 동적으로 조절

    • 주요 코드

      void APTPlayerAIController::RegisterSightConfig(FMonsterData* MonsterData)
      {
          if (!MonsterData) return;
      
          if (!AIPerceptionComponent->IsRegistered()) return;
      
          UAISenseConfig_Sight* SightConfig = NewObject<UAISenseConfig_Sight>(this, UAISenseConfig_Sight::StaticClass(), TEXT("SightConfig"));
          SightConfig->Implementation = UAISense_Sight::StaticClass();
          SightConfig->SightRadius = MonsterData->SightRadius;
          SightConfig->LoseSightRadius = MonsterData->LoseSightRadius;
          SightConfig->PeripheralVisionAngleDegrees = MonsterData->PeripheralVisionAngleDegrees;
          SightConfig->SetMaxAge(5.0f);
          SightConfig->DetectionByAffiliation.bDetectEnemies = true;
          SightConfig->DetectionByAffiliation.bDetectNeutrals = true;
          SightConfig->DetectionByAffiliation.bDetectFriendlies = false;
          SightConfig->SetStartsEnabled(true);
      
          AIPerceptionComponent->ConfigureSense(*SightConfig);
          AIPerceptionComponent->RegisterComponent();
      }

BehaviorTree

BehaviorTree는 AIComponent 및 AIController에서 처리된 데이터를 기반으로 작동한다.

  • 전체적인 AI Behavior Tree

    image

  • 주요 기능

    • BTT_RandomPatrol

      • AI 가 공격 상태가 아닐 경우 렌덤한 위치로 이동하는 기능

        image 1

    • BTT_Attack

      • AI가 플레이어를 감지 후 공격 범위에 있는지 확인 후 공격을 수행

        image 2

⚠️ **GitHub.com Fallback** ⚠️