icon

안동민 개발노트

8장 : AI 시스템 구축

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


지난 절들에서 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 (지배 감각): AI가 현재 가장 중요하게 여기는 감각을 설정합니다.
  • Team (팀): AI가 팀원이나 적을 구별하는 데 사용됩니다.

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

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: Detects Faction (Friendly/Neutral/Enemy) 설정 (기본값)
    • + 버튼을 클릭하여 AI Hearing Config를 추가합니다.
      • Sense Class: AISense_Hearing
      • Hearing Radius: 1000.0 (청각 반경)
      • Detection By Affiliation: Detects Faction 설정 (기본값)
  • Register as Source for Senses: (선택 사항) 이 AI가 다른 AI에게 감지될 소스(Source)가 될지 여부. (예: 이 AI가 내는 소리나 시각 정보가 다른 AI에게 감지될 수 있도록)
감지 이벤트 처리
  • AI Perception 컴포넌트를 선택한 상태에서 디테일 패널 하단의 이벤트(Events) 섹션으로 스크롤합니다.
  • On Target Perception Updated이벤트 옆의 + 버튼을 클릭하여 이벤트 노드를 추가합니다. 이 이벤트는 AI가 무언가를 감지하거나, 감지 상태가 변경될 때마다 발생합니다.
  • On Target Perception Updated 이벤트 노드에서 다음 로직을 구현합니다.
    • Actor 핀에서 Cast To BP_PlayerCharacter 노드를 연결합니다. (감지된 액터가 플레이어인지 확인)
    • Successfully Sensed 불리언 핀을 Branch 노드에 연결합니다.
    • True (플레이어 감지 성공)
      • BP_PlayerCharacterAs BP Player Character 핀에서 Get Actor Location 노드를 호출합니다.
      • Set Blackboard Value as Vector 노드를 호출합니다. Blackboard Key 핀에 플레이어 위치를 저장할 블랙보드 키(예: TargetLocation)를 연결합니다. Value 핀에 Get Actor LocationReturn Value를 연결합니다.
      • Set Blackboard Value as Object 노드를 호출합니다. Blackboard Key 핀에 플레이어 액터를 저장할 블랙보드 키(예: TargetActor)를 연결합니다. Value 핀에 Cast To BP_PlayerCharacterAs BP Player Character 핀을 연결합니다.
      • (선택 사항) Print String으로 플레이어 감지! 메시지 출력.
    • False (플레이어 시야/청각에서 벗어남)
      • Clear Blackboard Value 노드를 호출합니다. Blackboard Key 핀에 TargetLocationTargetActor 블랙보드 키를 연결하여 값을 지웁니다. (AI가 플레이어를 잃었을 때)
      • (선택 사항) Print String으로 플레이어 놓침! 메시지 출력.
  • 컴파일 및 저장합니다.

블랙보드에 키 추가

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

BB_EnemyAI 블랙보드 에셋 열기
새 키 추가
  • 키(Keys) 패널에서 + New Key 버튼을 클릭합니다.
  • Key TypeVector로 설정하고 Key NameTargetLocation으로 지정합니다.
  • + New Key 버튼을 다시 클릭합니다.
  • Key TypeObject로 설정하고 Key NameTargetActor로 지정합니다. Base ClassActor로 설정합니다.

컴파일 및 저장합니다.

플레이어 캐릭터에 추가

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

BP_PlayerCharacter 블루프린트 열기

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

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

  • Register as Source for Senses
    • + 버튼을 클릭하여 AISense_Sight를 추가합니다.
    • + 버튼을 다시 클릭하여 AISense_Hearing을 추가합니다.
  • On Owner See Me / On Owner Hear Me: (선택 사항) 이 컴포넌트의 소유자(플레이어)가 다른 AI에게 감지되었을 때 발생하는 이벤트.
청각 자극 생성 (발소리 예시)
  • BP_PlayerCharacter이벤트 그래프에서 플레이어가 움직일 때마다 Make Noise 노드를 호출합니다.
  • Make Noise 노드는 AI Perception 시스템에 소리 자극을 생성합니다.
    • Noise Location: 플레이어의 현재 위치 (Get Actor Location)
    • Loudness: 소리의 크기 (0.0 ~ 1.0, 클수록 멀리 감지됨)
    • Noise Tag: 소리의 종류를 구분하는 태그 (선택 사항)
    • Instigator: 소리를 낸 액터 (플레이어 자신)
  • (예시) Event Tick에서 Get Velocity를 통해 플레이어가 움직이는 속도를 확인하고, 일정 속도 이상일 때 Make Noise를 호출하도록 로직을 구성합니다. (또는 애니메이션 노티파이를 통해 발소리 발생 시점에 호출)
  • 컴파일 및 저장합니다.

AI 센서 반응 테스트

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

레벨에 BP_EnemyCharacterBP_PlayerCharacter를 배치합니다.

게임을 플레이합니다.

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

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

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


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

  • 성능: 너무 넓은 감지 반경이나 너무 많은 AI가 동시에 복잡한 감지를 수행하면 성능에 영향을 줄 수 있습니다. 적절한 반경과 감지 빈도를 설정해야 합니다.
  • 디버깅: AI Perception 컴포넌트의 Show Debug 옵션을 체크하면 에디터 뷰포트에서 AI의 시야각과 감지 반경을 시각적으로 확인할 수 있습니다.
  • 팀 관계: AI Perception은 팀(Faction) 시스템과 연동하여 아군/적군을 구별할 수 있습니다. AI Perception 컴포넌트의 Detection By Affiliation 설정을 통해 제어합니다.
  • 블랙보드 업데이트: 감지된 정보를 블랙보드에 정확하게 업데이트하는 것이 중요합니다. AI가 플레이어를 놓쳤을 때 블랙보드 값을 초기화하는 로직도 필수적입니다.

AI 센서 시스템은 AI에게 인지 능력을 부여하여 게임 세계에 대한 반응성을 높이고, 더욱 현실적이고 도전적인 AI를 구현하는 데 필수적인 요소입니다. 비헤이비어 트리, EQS와 함께 센서 시스템을 활용하면 복잡하고 지능적인 AI를 만들 수 있습니다.


이번 절에서는 언리얼 엔진의 AI Perception Component를 활용하여 AI의 시각 및 청각 센서 시스템을 구현하는 방법에 대해 알아보았습니다. AI가 주변 환경을 인지하고 반응하는 능력은 게임의 몰입도와 AI의 지능을 크게 향상시킵니다.

목차