AI - osy9611/ProjectPT GitHub Wiki
해당 문서는 Project PT의 AI 시스템을 정리하기 위한 문서이다.

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); } } }
-
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는 AIComponent 및 AIController에서 처리된 데이터를 기반으로 작동한다.
-
전체적인 AI Behavior Tree

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

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

-
-