언리얼5 AI 기본
- GameMode: 서버에서 게임 룰/스테이지 진행 관리
- GameState: 맵(게임) 전체의 전역 상태 저장. 점수, 라운드 등
- GameInstance: 게임 실행 전체에서 오직 하나(싱글톤) 생성, 맵 로딩이 바뀌어도 남아 있는 전역 저장소
- PlayerController: 각 플레이어마다 하나씩(클라이언트/서버 둘 다 별도 객체)
- PlayerState: 각 플레이어별 점수/닉네임 등 저장
- AIController: AI 개체마다 하나씩 생성
클래스 역할/비유 AIController AI의 뇌, 의사결정, 명령 Character AI의 몸체(이동, 애니메이션 등) NavigationSystem AI의 지도(경로 탐색, 길 안내) Perception System AI의 감각(시야, 청각 등 인지) Blackboard AI의 기억(데이터 저장·공유) Behavior Tree AI의 의사결정 트리, 플로우 차트식 NavigationSystem
- 언리얼은 AStar 알고리즘 내장
- 내비메시 바운드를 레벨에 설정하면 AI가 최적 경로(path finding) 자동 탐색
- Path following(실제로 경로를 따라 움직임)은 AIController의 MoveTo 계열 함수로 실행
AI Perception System
- AIPerceptionComponent를 AIController에 부착하는게 기본.
- AIPerceptionStimuliSourceComponent는 "감지 대상" 액터(보통 캐릭터)에 붙여줌
Details창의 “Auto Register as Source” 체크 필요
“AISense_Sight” 등 감지 센스 추가 설정AI가 감지 이벤트를 받을 때는 아래처럼 바인딩
AIPerception->OnTargetPerceptionUpdated.AddDynamic( this, &AQAIController::OnPerceptionUpdated );Blackboard
- 다양한 타입의 기억을 저장하는 구조
- 객체, 위치, 숫자, 불린 등 저장 가능
- SelfActor: 현재 자신 액터 정보(자기 위치/체력 등)
BlackboardComp->SetValueAsObject(TEXT("TargetActor"), Actor); BlackboardComp->SetValueAsBool(TEXT("CanSeeTarget"), true); BlackboardComp->SetValueAsVector(TEXT("TargetLastLocation"), Actor->GetActorLocation());반드시 BP_AIController에서 사용할 BB_Blackboard를 연결해야 함
Behavior Tree
- AI의 if/else 분기를 시각화해서 설계/디버깅 가능
- Sequence/Selector/Decorator/Service/Task 등 노드로 의사결정 플로우 구현
- 기본 노드로 불가능한 행동(특수 패턴 등)은 C++ Task로 직접 만들어 BT에 등록 가능
순찰 및 이동 로직
UBTTask_FindRandomLocation::UBTTask_FindRandomLocation() { NodeName = TEXT("Find Random Location"); LocationKey.AddVectorFilter(this, GET_MEMBER_NAME_CHECKED(UBTTask_FindRandomLocation, LocationKey)); } EBTNodeResult::Type UBTTask_FindRandomLocation::ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) { // 필요한 것드을 가져와야함 AAIController* AIController = OwnerComp.GetAIOwner(); if (!AIController) return EBTNodeResult::Failed; APawn* MyPawn = AIController->GetPawn(); if (!MyPawn) return EBTNodeResult::Failed; // 성공했냐 못했냐를 반환함 UNavigationSystemV1* NavSystem = UNavigationSystemV1::GetCurrent(GetWorld()); if(!NavSystem) return EBTNodeResult::Failed; FNavLocation RandomLocation; bool bFound = NavSystem->GetRandomPointInNavigableRadius( MyPawn->GetActorLocation(), SearchRadius, RandomLocation ); if (bFound) { UBlackboardComponent* BlackboardComp = OwnerComp.GetBlackboardComponent(); if (BlackboardComp) { BlackboardComp->SetValueAsVector(LocationKey.SelectedKeyName, RandomLocation.Location); return EBTNodeResult::Succeeded; } } return EBTNodeResult::Failed; }Build.cs
PublicDependencyModuleNames.AddRange(new string[] { "AIModule", // Perception, Blackboard 등 "NavigationSystem",// 네비게이션/경로탐색 "GameplayTasks" // AI MoveTo 등 });
- AI 관련 기능을 사용하려면 모듈 추가 필요
UPROPERTY
meta 키워드 기능/효과 자주 쓰는 예시 MakeEditWidget="true" 3D 뷰에 조작 위젯 노출(좌표/방향 직접 조작) FVector/Transform 등 위치 지정 AllowPrivateAccess="true" private 멤버여도 블루프린트/에디터에서 노출 허용 캡슐화+툴 편집 필요 변수(Health 등)