고급 AI를 갖춘 NPC들
요약
Godot 엔진을 활용하여 화학적 기반의 인공 생명(ALife) 시뮬레이션을 구현하는 방법을 다룹니다. VAD 모델과 신경망 가중치를 통해 NPC에게 정체성, 감정, 자율적 의사결정 능력을 부여하는 최적화된 설계 방식을 설명합니다.
핵심 포인트
- 타임 슬라이스 처리를 통한 CPU 스파이크 방지 및 최적화
- VAD 모델 기반의 화학적 감정 상태 시뮬레이션
- 신경망 가중치를 활용한 정체성 및 행동 결정 엔진
- 27가지 감정 매트릭스를 통한 애니메이션 연동
godot 3로 시작하여 현재 4.6 버전을 사용한 지 어느 정도 시간이 흐른 지금, 저는 NPC들이 최대한 살아있는 것처럼 느껴지게 만드는 방법들을 연구해 왔습니다.
최종 결과물은 매우 최적화된, 화학적 기반의 인공 생명 (ALife) 시뮬레이션입니다. 모든 NPC는 자신의 정체성, 현재의 감정 상태, 그리고 순수한 부동 소수점 연산 (float math)을 바탕으로 무엇을 할지 결정합니다.
내부적으로 NPC를 구동하는 시스템의 세부 사항은 다음과 같습니다:
- 타임 슬라이스 처리 (Time-Sliced Processing, AI 매니저)
프레임 드랍 없이 60명 이상의 복잡한 NPC를 처리하기 위해, 저는 전역 Autoload 매니저를 구축했습니다. 모든 NPC가 매 프레임마다 복잡한 레이캐스트 (raycasts)와 신경망 연산을 수행하는 대신, 매니저가 이를 배치 (batches) 단위로 분산하여 처리합니다. 60 FPS 기준으로, 마을 전체가 생존 결정을 재계산하는 횟수는 초당 정확히 5회입니다. 이는 시각적으로는 즉각적으로 보이지만, CPU 스파이크 (CPU spikes)를 완전히 완화해 줍니다.
- 정체성 청사진 (Identity Blueprint, 브레인 프로필)
NPC들은 자신의 "직업"이 무엇인지 알지 못합니다. "직업 == '대장장이'"라고 명시하는 코드는 존재하지 않습니다. 대신, 정체성은 신경망 가중치 (neural weights)를 포함하는 커스텀 리소스 (.tres)에 의해 구동됩니다. 마스터 빌더 (Master Builder)는 우연히 labor_instinct 값이 0.9인 것이고, 마을 부랑자 (Town Bum)는 0.0인 것입니다. 저는 인스펙터 (inspector)에서 부동 소수점 슬라이더를 조정하는 것만으로 완전히 새로운 가계도와 세대별 역할을 만들어낼 수 있습니다.
- 내분비계 (Endocrine System, VAD 모델)
모든 NPC는 세 가지 핵심 부동 소수점 값(-1.0에서 1.0 사이)을 통해 추적되는 시뮬레이션된 내부 화학 상태를 가집니다: 가치 (Valence, 즐거움/고통), 각성 (Arousal, 에너지), 그리고 지배성 (Dominance, 통제/무력함). 이 값들은 각 가계도에 정의된 특정 휴식 기준치 (resting baselines)를 향해 자연스럽게 감쇠합니다.
- 27가지 상태의 감정 매트릭스 (27-State Emotion Matrix)
거대하고 느린 if/elif 체인 대신, 저는 3x3x3 양자화 그리드 (quantized grid)를 구축했습니다. 시스템은 가공되지 않은 VAD 화학 수치를 읽어 들여 이를 즉시 27가지의 뚜렷한 감정 상태(예: "공포", "흥분", "지루함", "질투") 중 하나로 매핑합니다. 이 문자열은 이후 AnimationTree로 직접 전달되어 NPC의 자세와 걷기 사이클을 변경합니다.
- 신경망 (Neural Network, 결정 엔진)
결정은 순수하게 수학적으로 이루어집니다. Brain(두뇌)은 환경적 입력값(예: Wood Node 또는 Player와의 근접성)을 살펴보고, 이를 Brain Profile(두뇌 프로필) 가중치 및 현재의 정서적 긴급도(emotional urgency)와 곱합니다.
예시: 만약 몬스터 포털이 열리면, "Threat(위협)" 입력값이 급증합니다. Brain은 이를 해당 NPC의 Helplessness(무력함, Dominance의 역값)와 곱합니다. 일반 시민의 경우 "Flee(도망)" 점수가 일하는 욕구보다 수학적으로 더 높아지겠지만, Mayor(시장, 높은 Dominance 보유)는 자리를 지킬 수도 있습니다. 가장 높은 점수를 얻은 행동이 항상 승리합니다.
- Memory Logging(메모리 로깅) 및 Autonomous Hobbies(자율적 취미)
NPC가 작업을 마치면, 해당 행동과 그 행동이 산출한 정확한 Valence(쾌락/가치)를 딕셔너리(dictionary)에 기록합니다. 만약 Emotion Matrix(감정 매트릭스)가 "Boredom(지루함)" 상태에 도달하면, 이들은 Memory Bank(메모리 뱅크)를 조회하여 가장 높은 수익을 냈던 경험을 찾아내고, 이를 취미로서 자율적으로 수행합니다. 또한, 야간 감쇠 프로토콜(overnight decay protocol)이 존재합니다. 만약 몇 주 동안 어떤 행동을 하지 않았다면, 해당 기억의 정서적 전하(emotional charge)는 0.0으로 흐릿해지며 RAM을 절약하기 위해 영구적으로 삭제됩니다.
- Chemical Social Webs(화학적 사회 관계망) 및 Viral Gossip(바이럴 가십)
Affinity Ledger(친밀도 장부)가 관계를 추적하지만, 상호작용은 무작위 주사위 굴리기가 아닙니다. 두 NPC가 대화할 때, 수학적으로 화학적 시너지(chemical synergy)를 확인합니다. 만약 두 명의 높은 Dominance 캐릭터가 대화하면, 수학적으로 충돌합니다. 만약 그들의 에너지 수준(Arousal, 각성)이 일치하지 않으면, 어색한 상황이 됩니다.
Gossip Protocol(가십 프로토콜): 상호작용이 잘 풀리면, 그들은 가장 정서적으로 강렬했던 기억(예: Night Portal에서 공격받은 경험)을 복제하여 상대 NPC의 뇌로 직접 밀어 넣습니다. 기억의 강도는 전달될 때마다 약간씩 희석됩니다. 이는 공포와 지식이 마을의 소문 유통망을 통해 블록 단위로 물리적으로 확산됨을 의미합니다!
충분한 시뮬레이션이 실행되어 모두 성공적인 결과를 낼 때쯤, 이를 보여주는 영상을 제작할 예정입니다.
🤙🏻🤙🏻 다음 시간에 뵙겠습니다~
AI 자동 생성 콘텐츠
본 콘텐츠는 r/godot (top/week)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기