안동민 개발노트

본문 시작

기본 센서 시스템 구현 (시각, 청각)

AI Perception의 시각·청각 감각을 설정하고 감지 결과를 블랙보드에 반영해 플레이어 반응을 구현합니다.

지난 절들에서 AI의 의사결정(비헤이비어 트리), 환경 분석(EQS), 이동(내비게이션)을 다뤘습니다.

이번에는 AI가 게임 세계를 인지하는 방법으로 넘어갑니다.

주변 환경과 플레이어/NPC를 감지해 반응하려면, 인간의 오감과 유사한 센서 시스템이 필요합니다.

언리얼 엔진은 AI가 시각, 청각, 촉각 등 다양한 방식으로 환경을 감지할 수 있도록 AI Perception Component를 비롯한 강력한 센서 시스템을 제공합니다.

이번 절에서는 플레이어 감지에 가장 많이 쓰이는 시각/청각 센서 시스템 구현 방법을 정리합니다.


AI 센서 시스템이란 무엇인가?

AI 센서 시스템은 AI가 주변 환경으로부터 정보를 수집하고, 이를 바탕으로 게임플레이 로직에 필요한 데이터를 얻는 메커니즘입니다.

AI는 이 센서 시스템을 통해 플레이어의 위치, 소리, 행동 등을 감지하고, 이를 비헤이비어 트리의 의사결정 과정에 활용합니다.

AI 센서 시스템이 필요한 이유
  • 환경 인지: AI가 게임 세계에 대한 정보를 얻고, 이를 통해 지능적인 행동을 할 수 있도록 합니다.
  • 반응성: 플레이어의 행동(예: 발소리, 총성, 시야에 들어옴)에 AI가 실시간으로 반응하도록 만듭니다.
  • 게임플레이 설계: 은신, 잠입, 추격 등 다양한 게임플레이 메커니즘을 센서 시스템을 통해 구현할 수 있습니다.
  • 현실감: AI가 맹목적으로 행동하는 것이 아니라, 실제로 주변을 인지하고 반응하는 듯한 현실감을 부여합니다.

AI Perception Component

언리얼 엔진에서 AI 센서 시스템을 구현하는 핵심은 AI Perception Component입니다.

이 컴포넌트는 다양한 감각(Sense)을 통합하여 관리하며, 감지된 정보를 이벤트로 발생시켜 AI 컨트롤러나 비헤이비어 트리에서 활용할 수 있게 합니다.

지원하는 주요 감각(Sense)
  • Sight (시각): AI가 특정 시야각 내에서 다른 액터(플레이어, 다른 NPC 등)를 볼 수 있는지 감지합니다.
  • Hearing (청각): AI가 특정 반경 내에서 발생하는 소리(발소리, 총성 등)를 들을 수 있는지 감지합니다.
  • Damage (피해): AI가 데미지를 입었을 때 이를 감지합니다.
  • Dominant Sense (속성): 별도 감각 종류가 아니라 감지한 액터의 위치를 결정할 때 우선할 감각을 지정합니다.
  • Team (팀 감각): 게임 로직이 보낸 팀 이벤트를 감지합니다. 아군·중립·적 필터는 별도의 Affiliation 설정과 팀 관계 구현으로 결정됩니다.

기본 센서 시스템 구현: 시각 및 청각 감지

AI가 플레이어를 시각적으로 감지하고, 플레이어가 내는 소리를 감지하도록 설정해봅시다.

필요한 블루프린트
  • AI 폰 블루프린트 (예: BP_EnemyCharacter)
  • AI 컨트롤러 블루프린트 (예: AIC_Enemy)
  • 플레이어 캐릭터 블루프린트 (예: BP_PlayerCharacter)

AI 컨트롤러에 추가 및 설정

AI Perception Component는 AI 컨트롤러에 추가하는 것이 일반적입니다.

AIC_Enemy 블루프린트 열기

컴포넌트 추가: 컴포넌트(Components) 패널에서 + Add 버튼을 클릭하고 AI Perception을 검색하여 추가합니다.

AI Perception 설정: AI Perception 컴포넌트를 선택하고 디테일(Details) 패널에서 다음을 설정합니다.

  • Senses Config (감각 설정)
    • + 버튼을 클릭하여 AI Sight Config를 추가합니다.
      • Sense Class: AISense_Sight
      • Sight Radius: 1500.0 (시야 반경)
      • Lose Sight Radius: 2000.0 (시야에서 벗어나는 반경)
      • Peripheral Vision Half Angle Degrees: 60.0 (시야각의 절반, 총 120도 시야각)
      • Detection By Affiliation: 실습에서는 Detect Neutrals를 켜고 플레이어 Cast로 대상을 거릅니다. 아군/적 분류를 쓰려면 별도 팀 관계를 구현합니다.
    • + 버튼을 클릭하여 AI Hearing Config를 추가합니다.
      • Sense Class: AISense_Hearing
      • Hearing Range: 1000.0 (청각 반경)
      • Detection By Affiliation: 실습 대상에 맞게 Detect Neutrals를 켭니다.
  • 소스 등록은 수신용 Perception이 아니라 아래의 AIPerceptionStimuliSource에서 설정합니다. Blackboard는 트리 초기화 뒤에 접근해야 하며, 그 전 이벤트를 처리한다면 초기화 이후 다시 반영하는 경로가 필요합니다.
감지 이벤트 처리
  • AI Perception 컴포넌트를 선택한 상태에서 디테일 패널 하단의 이벤트(Events) 섹션으로 스크롤합니다.
  • On Target Perception Updated이벤트 옆의 + 버튼을 클릭하여 이벤트 노드를 추가합니다. 이 이벤트는 AI가 무언가를 감지하거나, 감지 상태가 변경될 때마다 발생합니다.
  • 이벤트의 Actor를 플레이어로 Cast하고, Stimulus를 Break AIStimulus로 나눕니다. Get Sense Class for Stimulus로 Sight/Hearing을 구분합니다.
  • Get Blackboard로 얻은 Blackboard Component에 Set Value as Object/Vector, Clear Value를 호출합니다. BT 노드용 Set Blackboard Value as...와 호출 대상을 혼동하지 않습니다.
  • 아래 정책에 따라 갱신합니다. 청각 이벤트의 위치는 Stimulus Location을 사용하며, 보이지 않는 액터의 현재 위치를 계속 읽어 추적하지 않습니다.
감각별 Blackboard 갱신 정책

감각별 Blackboard 갱신 정책

감각별 Blackboard 갱신 정책
받은 사건기록할 값유지·해제 기준
시각 성공TargetActor에 플레이어, TargetLocation에 확인 위치를 기록합니다.현재 시각 타깃을 설정합니다.
시각 상실해당 TargetActor를 비웁니다.마지막 TargetLocation은 조사할 단서로 유지합니다.
청각 성공시각 타깃이 없을 때 TargetLocation에 Stimulus Location을 기록합니다.소리만으로 현재 시각 타깃을 만들지 않습니다.
청각 만료해당 소음의 증거 수명을 갱신합니다.보이는 타깃을 지우지 않습니다. 조사 완료 시 위치를 해제합니다.
받은 사건: 시각 성공
기록할 값: TargetActor에 플레이어, TargetLocation에 확인 위치를 기록합니다.
유지·해제 기준: 현재 시각 타깃을 설정합니다.
받은 사건: 시각 상실
기록할 값: 해당 TargetActor를 비웁니다.
유지·해제 기준: 마지막 TargetLocation은 조사할 단서로 유지합니다.
받은 사건: 청각 성공
기록할 값: 시각 타깃이 없을 때 TargetLocation에 Stimulus Location을 기록합니다.
유지·해제 기준: 소리만으로 현재 시각 타깃을 만들지 않습니다.
받은 사건: 청각 만료
기록할 값: 해당 소음의 증거 수명을 갱신합니다.
유지·해제 기준: 보이는 타깃을 지우지 않습니다. 조사 완료 시 위치를 해제합니다.
  • Sight 상실과 Hearing 갱신은 서로 다른 사건입니다. 한 자극의 실패만으로 다른 감각 상태까지 지우지 않습니다. 여러 대상을 다루는 확장은 액터별 감각 상태와 목표 우선순위를 별도로 둡니다.
  • 컴파일 및 저장합니다.

블랙보드에 키 추가

AI 컨트롤러에서 감지된 정보를 저장할 블랙보드 키를 생성해야 합니다.

BB_EnemyAI 블랙보드 에셋 열기
새 키 추가
  • 키(Keys) 패널에서 + New Key 버튼을 클릭합니다.
  • Key Type을 Vector로 설정하고 Key Name을 TargetLocation으로 지정합니다. 감지 위치를 기록할 때만 설정하고, 조사 완료 시 Clear Value로 비웁니다.
  • + New Key 버튼을 다시 클릭합니다.
  • Key Type을 Object로 설정하고 Key Name을 TargetActor로 지정합니다. Base Class는 Actor로 설정합니다.

컴파일 및 저장합니다.

플레이어 캐릭터에 추가

플레이어 캐릭터가 AI에게 감지될 수 있도록 자극원(Stimuli Source) 역할을 하도록 설정해야 합니다.

BP_PlayerCharacter 블루프린트 열기

컴포넌트 추가: 컴포넌트(Components) 패널에서 + Add 버튼을 클릭하고 AIPerceptionStimuliSource를 검색하여 추가합니다.

Stimuli Source 설정: AIPerceptionStimuliSource 컴포넌트를 선택하고 디테일(Details) 패널에서 다음을 설정합니다.

  • Register as Source for Senses
    • + 버튼을 클릭하여 AISense_Sight를 추가합니다.
    • + 버튼을 다시 클릭하여 AISense_Hearing을 추가합니다.
  • Auto Register as Source를 켭니다. 이 컴포넌트에 On Owner See Me / On Owner Hear Me 이벤트가 있는 것은 아니며, 감지 이벤트는 수신자의 Perception에서 처리합니다.
청각 자극 생성 (발소리 예시)
  • 캐릭터의 발소리 Notify나 발사 이벤트에서 Report Noise Event를 호출합니다. 실제 오디오 재생만으로 AI Hearing 자극이 자동 발생하는 것은 아닙니다.
  • Noise Location은 발생 위치, Instigator는 플레이어, Loudness는 양수 세기(예: 1), Tag는 소리 구분값으로 설정합니다. Max Range와 수신 Hearing Range도 확인합니다.
  • 매 Tick 호출보다 실제 소음 시점에 호출하여 불필요한 자극을 줄입니다.
  • 컴파일 및 저장합니다.

AI 센서 반응 테스트

모든 블루프린트를 컴파일하고 저장합니다.

레벨에 BP_EnemyCharacter와 BP_PlayerCharacter를 배치합니다.

게임을 플레이합니다.

BP_EnemyCharacter의 시야 범위 내로 이동하거나, 소리를 내면 (움직이거나 총을 쏘는 등), AI가 플레이어를 감지하고 TargetLocation 및 TargetActor 블랙보드 키가 업데이트되는 것을 확인할 수 있습니다.

AI 컨트롤러의 On Target Perception Updated 이벤트에서 설정한 Print String 메시지를 통해 감지 여부를 확인합니다.

AI가 플레이어를 감지하면 비헤이비어 트리가 플레이어를 추적하는 행동으로 전환되는지 확인합니다.


센서 시스템 활용 시 고려사항

  • 성능: 너무 넓은 감지 반경이나 너무 많은 AI가 동시에 복잡한 감지를 수행하면 성능에 영향을 줄 수 있습니다. 적절한 반경과 감지 빈도를 설정해야 합니다.
  • 디버깅: PIE에서 apostrophe 키로 Gameplay Debugger를 열고 Numpad 4의 Perception 표시를 확인합니다. 입력 설정에 따라 키는 달라질 수 있습니다.
  • 팀 관계: AI Perception은 팀(Faction) 시스템과 연동하여 아군/적군을 구별할 수 있습니다. AI Perception 컴포넌트의 Detection By Affiliation 설정을 통해 제어합니다.
  • 블랙보드 업데이트: 감지된 정보를 블랙보드에 정확하게 업데이트하는 것이 중요합니다. 타깃 상실과 마지막 위치 기억의 해제 시점을 구분합니다. 감각의 Max Age=0은 자동으로 잊지 않는 설정이며, 시간 만료 정책에는 Forget Stale Actors 등 관련 설정을 함께 확인합니다.

AI 센서 시스템은 AI에게 인지 능력을 부여하여 게임 세계에 대한 반응성을 높이고, 더욱 현실적이고 도전적인 AI를 구현하는 데 필수적인 요소입니다.

비헤이비어 트리, EQS와 함께 센서 시스템을 활용하면 복잡하고 지능적인 AI를 만들 수 있습니다.