Elden Ring의 로우테크 AI 아키텍처

Elden Ring의 로우테크 AI 아키텍처

Elden Ring은 복잡한 계획 알고리즘이 아니라, 비교적 단순한 "로우테크" AI 아키텍처를 통해 가혹하고 다양한 NPC 조우를 구현합니다. 이 시스템은 주로 Havok Script(게임 지향적 Lua 구현체)로 구현되었으며, 전통적인 Finite State Machine(FSM)이나 복잡한 Behavior Tree 대신 Pushdown Automaton(PDA)에 의존합니다.

목표 기반 Pushdown Automaton

Elden Ring의 AI는 AI가 점유할 수 있는 고유한 상태인 Goal 개념을 중심으로 합니다. 한 상태에서 다른 상태로 전환되는 표준 Finite State Machine과 달리, FromSoftware는 **목표의 스택(stack of goals)**을 사용하여 시스템을 Pushdown Automaton으로 만듭니다.

목표 스택의 작동 방식

각 프레임마다 Actor는 스택의 최상단에 있는 Goal을 업데이트합니다. 실행 흐름은 다음 규칙을 따릅니다:

  • Sub-Goals: Goal은 스택에 새로운 "Sub-Goals"를 푸시할 수 있습니다. 최상단의 Sub-Goal은 다음 프레임에 실행됩니다.
  • Return Values: Goal의 업데이트 함수는 Continue, Success, 또는 Failure 중 하나의 값을 반환합니다.
  • Popping the Stack: Success 또는 Failure는 현재 Goal이 스택에서 팝(pop)되도록 합니다.
  • Unwinding: Failure 결과는 스택을 언와인딩(unwinding)하여, 부모 Goal에 도달할 때까지 실행되지 않은 모든 Sub-Goals를 팝합니다.

이 구조는 AI가 일련의 동작(예: 콤보 공격)을 시도하고, 해당 시퀀스의 일부가 실패할 경우 상위 수준의 결정 상태로 우아하게 돌아갈 수 있게 합니다.

Activate Callback을 통한 의사 결정

핵심 AI 로직은 Goal이 처음 업데이트되거나, Sub-Goals를 모두 소진하고 실행을 재개할 때 트리거되는 activate 콜백에 상주합니다.

가중치 기반 랜덤 선택

다음 동작을 결정하기 위해 AI는 일반적으로 가중치 기반 랜덤 선택 프로세스를 사용합니다. activate 함수는 플레이어와의 거리나 Actor의 현재 체력과 같은 현재 컨텍스트를 평가하고, 가능한 동작 목록에 가중치를 할당합니다.

예를 들어, 타겟이 멀리 있다면 "Approach Target" Goal의 가중치가 증가하고, 타겟이 가깝다면 "Heavy Attack"의 가중치가 증가합니다. 이러한 가중치는 AI가 동일한 동작을 반복해서 사용하는 것을 방지하기 위해 쿨다운(cooldown)에 의해 추가로 수정될 수 있습니다.

Interrupt를 통한 반응형 동작

NPC가 플레이어의 동작에 즉각적으로 반응하도록 보장하기 위해, 시스템은 Interrupt 메커니즘을 사용합니다. Interrupt는 현재 실행 중인 Goal에서 부모 Goal로 재귀적으로 버블링(bubbling up)되어, Interrupt가 "소비(consumed)\

Sources