본문으로 건너뛰기

안동민 개발노트

본문 시작

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

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

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

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

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

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

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

Perception은 행동 명령이 아니라 시간 제한이 있는 감각 증거를 만든다

감각·성공·위치·나이를 Blackboard에 정규화하고 Behavior Tree가 행동을 판단하게 한다.

  1. 1. Stimuli Source

    Stimuli Source Actor가 지정한 sense에 자동 또는 수동 등록된다.

  2. 2. Sense config

    Sense config Sight·Hearing·Damage의 범위, affiliation, Max Age를 설정한다.

  3. 3. Perception event

    Perception event On Target Perception Updated 에서 Actor와 Stimulus를 받는다.

  4. 4. Evidence policy

    Evidence policy sense, success, location, age로 target 우선순위와 기억 상태를 정한다.

  5. 5. Blackboard

    Blackboard TargetActor· LastKnownLocation· HasLineOfSight를 한 이벤트에서 함께 갱신한다.

  6. Sight · 현재 가시성

    시야각·radius·occlusion을 보고 Actor 참조와 마지막 위치를 구분한다.

  7. Hearing · 사건 위치

    noise의 위치·세기·tag를 추적 단서로 쓴다. 현재 시야 확보와는 다르다.

  8. Damage · 위협 사건

    해 Actor와 위치를 높은 우선순위 증거로 쓰고 만료 정책을 둔다.


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 Perception 연결

감각 설정만 추가하면 끝이 아닙니다. 감지 이벤트가 TargetActor와 TargetLocation으로 이어지도록 각 블루프린트의 역할을 맞춰야 합니다.

  1. blueprint
    구현 순서

    blueprint 1 AI Perception Component를 추가합니다. 2 Sight와 Hearing 설정을 각각 등록합니다. 3 On Target Perception Updated를 만듭니다. 4 TargetActor와 TargetLocation 키를 준비합니다. 5 Stimuli Source와 Make Noise로 자극을 보냅니다.

  2. AIC_Enemy

    AI Perception Component를 추가합니다.

  3. Senses Config

    Sight와 Hearing 설정을 각각 등록합니다.

  4. Perception Event

    On Target Perception Updated를 만듭니다.

  5. Blackboard

    TargetActor와 TargetLocation 키를 준비합니다.

  6. Player Source

    Stimuli Source와 Make Noise로 자극을 보냅니다.

  7. sense
    감각별 설정 포인트

    sense Sight Radius , Lose Sight Radius , 시야각을 함께 조정합니다. Hearing Radius 와 Loudness 가 소리 감지 거리를 결정합니다. 아군, 중립, 적 중 어떤 대상을 감지할지 명확히 둡니다.

  8. Sight

    Radius , Lose Sight Radius , 시야각을 함께 조정합니다.

  9. Hearing

    Radius 와 Loudness 가 소리 감지 거리를 결정합니다.

  10. 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: 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 센서 반응 테스트

AI Perception 자극 수명 흐름

시야와 청각 자극이 감지, 갱신, 만료를 거쳐 Blackboard 키와 경계 상태를 바꾸는 과정을 시간 흐름으로 정리한다.

  1. 1
    Stimulus 생성

    플레이어가 시야에 들어오거나 소음을 만들면 Perception Component가 자극을 받는다. sense input

  2. 2
    Blackboard 갱신

    감지 성공 시 Target Actor, Last Known Location, Alert Level 키를 기록한다. memory write

  3. 3
    행동 전환

    Behavior Tree는 키 변화를 보고 순찰, 조사, 추적 중 하나를 선택한다. BT select

  4. 4
    자극 만료

    일정 시간 새 감지가 없으면 target을 비우고 마지막 위치 조사 상태로 낮춘다. expiration

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

레벨에 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의 지능을 크게 향상시킵니다.


AI Perception은 감지 이벤트를 바로 행동으로 연결하기보다 블랙보드 상태로 정리하면 디버깅이 쉬워집니다.

아래 다이어그램은 센서 이벤트 라우팅 기준입니다.

AI Perception은 감지 이벤트를 Blackboard 상태로 축약한다

센서 신호를 바로 행동으로 연결하지 말고 신뢰도와 마지막 위치를 정리해 트리에 넘긴다.

  1. Sense

    Sight와 Hearing이 자극을 수신한다.

  2. Stimulus

    성공 여부, 위치, 감지 시간을 분리한다.

  3. Blackboard

    TargetActor, LastKnownLocation, HasLineOfSight를 갱신한다.

  4. Behavior Tree

    추적, 조사, 복귀 가지를 선택한다.

  5. Expire

    오래된 자극은 Age 기준으로 지운다.

기준판정
보자마자 공격함신뢰도와 팀 필터 없이 행동으로 바로 연결된 상태다.
소리에 반응 없음Hearing 반경, Tag, Stimulus 위치를 확인한다.

센서 시스템은 “보았는가/들었는가”보다 감지 신호를 어떤 블랙보드 키와 행동 전환으로 연결할지까지 함께 설계해야 안정적입니다.

AI 센서는 감지 신호를 상태로 번역한다

시각과 청각 이벤트를 즉시 행동으로 이어 붙이기보다 블랙보드 키로 정리하면 비헤이비어 트리와 디버깅이 안정됩니다.

  1. 센서 단서
    센서 단서 Sight Hearing

    Blackboard

  2. On Target Perception Updated

    actor, stimulus, last seen 위치를 분리해서 받는다.

  3. Sight / Hearing 판정

    성공 여부와 감각 종류로 추적 또는 탐색 경로를 가른다.

  4. Blackboard Keys

    TargetActor LastKnown HasLOS

  5. Behavior Tree

    키 상태를 읽어 chase, investigate, patrol을 선택한다.

  6. detect

    감지 반경과 시야각이 의도와 맞는지 표시합니다.

  7. filter

    팀 관계와 감지 대상 조건을 확인합니다.

  8. write key

    블랙보드 업데이트와 초기화 경로를 둡니다.

  9. debug

    Perception과 Blackboard 디버그 화면을 함께 봅니다.

마지막으로 AI Perception으로 시각과 청각 이벤트를 받을 때 Blackboard에 전달하는 기준을 정리합니다.

AI Perception 감지 이벤트 처리

시각과 청각 감지는 AIController의 Perception Component가 받고 Blackboard Key로 행동 트리에 전달합니다.

  1. 감지는 이벤트, 판단은 Blackboard

    플레이어가 시야에 들어오면 TargetActor를 설정하고, 잃어버리면 LastKnownLocation이나 HasLineOfSight를 갱신합니다. 01 Sight Radius, Lose Sight Radius, Peripheral Vision Angle, Detection by Affiliation을 AI 성격에 맞게 조정합니다. 02 Make Noise나 Pawn Noise Emitter로 소음을 보내고 Hearing Range 안에서 위치를 LastHeardLocation에 저장합니다. 03 On Target Perception Updated의 Stimulus Was Successfully Sensed 값으로 획득과 상실을 나눕니다.

  2. 감지는 이벤트, 판단은 Blackboard

    플레이어가 시야에 들어오면 TargetActor를 설정하고, 잃어버리면 LastKnownLocation이나 HasLineOfSight를 갱신합니다.

  3. 시야 설정

    Sight Radius, Lose Sight Radius, Peripheral Vision Angle, Detection by Affiliation을 AI 성격에 맞게 조정합니다.

  4. 청각 설정

    Make Noise나 Pawn Noise Emitter로 소음을 보내고 Hearing Range 안에서 위치를 LastHeardLocation에 저장합니다.

  5. 이벤트 분기

    On Target Perception Updated의 Stimulus Was Successfully Sensed 값으로 획득과 상실을 나눕니다.