2025/07/24 TIL

민트맛치킨·2025년 7월 24일

Unreal

목록 보기
23/26

언리얼5 AI 기본

  • GameMode: 서버에서 게임 룰/스테이지 진행 관리
  • GameState: 맵(게임) 전체의 전역 상태 저장. 점수, 라운드 등
  • GameInstance: 게임 실행 전체에서 오직 하나(싱글톤) 생성, 맵 로딩이 바뀌어도 남아 있는 전역 저장소
  • PlayerController: 각 플레이어마다 하나씩(클라이언트/서버 둘 다 별도 객체)
  • PlayerState: 각 플레이어별 점수/닉네임 등 저장
  • AIController: AI 개체마다 하나씩 생성
클래스역할/비유
AIControllerAI의 뇌, 의사결정, 명령
CharacterAI의 몸체(이동, 애니메이션 등)
NavigationSystemAI의 지도(경로 탐색, 길 안내)
Perception SystemAI의 감각(시야, 청각 등 인지)
BlackboardAI의 기억(데이터 저장·공유)
Behavior TreeAI의 의사결정 트리, 플로우 차트식
  • 언리얼은 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 등)

0개의 댓글