1. 언리얼 엔진 5.5의 유틸리티 AI 기능 소개 [0]

thumbnail 언리얼 엔진 5.5에 새롭게 도입된 유틸리티 AI는 복잡한 NPC 행동을 상태 트리로 간편하게 구현할 수 있도록 지원한다. [0]

1.1. 유틸리티 AI의 기본 원리 [0]

  1. 핵심 개념: 유틸리티 AI는 NPC가 취할 수 있는 여러 상태에 대해 각각 점수를 계산하고, 가장 높은 점수를 받은 상태를 선택하여 실행한다. [4]
    1. 상태 실행 후에는 다시 모든 상태의 점수를 재계산하여 다음 행동을 결정한다. [4]
  2. 구현 환경: 간단한 AI 캐릭터와 상태 트리가 설정된 월드에서 작동하며, 자동 내비게이션 링크와 일주기 시스템이 적용되어 있다. [5]
    1. AI 캐릭터는 AI 인식 컴포넌트를 통해 플레이어를 감지하고 추격하거나 탐색하는 행동을 한다. [6]
  3. 필수 플러그인: 상태 트리 플러그인과 일주기 시퀀스 플러그인을 활성화해야 한다. [7]

1.2. 상태 트리 생성 및 설정 [8]

  1. 상태 트리 생성:
    • 인공지능 > 상태 트리를 선택하여 생성한다. [8]
    • AI 컨트롤러에 적용할 상태 트리 AI 컴포넌트를 생성하고 state tree utility로 명명한다. [8]
  2. AI 컨트롤러 및 컨텍스트 액터 설정:
    • 생성한 AIC utility를 AI 컨트롤러로 설정한다. [9]
    • BP utility AI character를 컨텍스트 액터로 설정한다. [10]
  3. 자식 상태 추가:
    • explore world, chase player, go to sleep, replenish stamina의 네 가지 자식 상태를 추가한다. [13]
  4. 선택 행동 설정:
    • 부모 상태의 Selection behavior를 Try to select children with highest utility로 설정한다. [15]
    • 동점일 경우, 순서대로 선택하는 select in order 옵션이 적용된다. [15]

1.3. 각 상태별 작업(Task) 및 유틸리티 계산 [18]

  1. 작업(Task) 구성: 각 상태에 필요한 작업을 추가한다. [19]
    • explore world: Move to location 작업으로 특정 위치로 이동 후 지연시킨다. [21]
    • chase player: 플레이어의 위치를 찾아 이동한다. [23]
    • go to sleep: 특정 클래스의 액터를 찾아 이동한다. [24]
    • replenish stamina: BP well 타입의 액터를 찾아 이동 후 스태미나를 회복한다. [25]
  2. 유틸리티 계산 방법:
    • 변수 접근 (파라미터): AI 컨트롤러의 player sensed 변수를 사용하여 플레이어 감지 여부에 따라 점수를 계산한다. [32]
      • explore world: 플레이어가 감지되지 않았을 때(player sensed == false) 점수 1을 반환한다. [34]
      • chase player: 플레이어가 감지되었을 때(player sensed == true) 점수 1을 반환한다. [38]
  3. 이벤트 기반 재평가:
    • 각 상태에 On Event를 추가하여 Chase 또는 Explore 게임플레이 태그 이벤트를 받으면 유틸리티를 재계산하도록 설정한다. [42]
    • 이는 플레이어 감지 상태 변화 시 즉각적인 행동 전환을 가능하게 한다. [45]

1.4. 시간 기반 및 속성 기반 유틸리티 계산 [48]

  1. go to sleep 상태:
    • 일주기 시퀀스 액터에서 현재 시간을 가져온다. [50]
    • 밤 시간대(is nighttime == true)일 때 점수 1을 반환하도록 설정한다. [54]
  2. replenish stamina 상태:
    • AI 캐릭터의 Attributes component에 있는 stamina 속성을 사용한다. [58]
    • 스태미나 값이 40 미만일 때 점수 1을 반환하도록 응답 곡선(Response Curve)을 설정한다. [64]
      • 입력 범위(Input Range)를 0-100으로 설정하여 스태미나 값을 정규화한다. [71]
      • 0-40% 스태미나 구간에서 점수 1을, 그 외 구간에서는 점수 0을 반환하도록 곡선을 구성한다. [74]
    • stamina 변수에 바인딩하고 입력 범위를 0-100으로 설정한다. [77]

1.5. 가중치(Weight)를 이용한 우선순위 설정 [81]

  1. 가중치의 필요성: 여러 상태가 동시에 높은 유틸리티 점수를 반환할 경우, 가중치를 통해 우선순위를 결정한다. [81]
  2. 가중치 설정:
    • explore world: 가중치 1 [88]
    • chase player: 가중치 2 (탐색보다 중요) [89]
    • go to sleep: 가중치 3 (야간에 우선순위 높음) [91]
    • replenish stamina: 가중치 4 (항상 최우선) [93]
  3. 최종 점수 계산: 각 상태의 유틸리티 점수는 가중치와 곱해져 최종 점수가 된다. [92]

1.6. 고려사항(Consideration)을 활용한 유틸리티 계산 [104]

  1. 고려사항(Consideration)이란: 유틸리티 점수를 더 유연하고 사용자 정의 방식으로 계산할 수 있는 블루프린트 클래스이다. [104]
  2. 고려사항 생성:
    • State Tree Consideration Blueprint Base를 상속받아 state tree consideration utility state를 생성한다. [106]
    • Get Score 함수를 오버라이드하여 점수를 반환한다. [108]
  3. 고려사항 적용 예시:
    • explore world 상태에 고려사항을 추가하여 player sensed 변수에 따라 점수를 반환한다. (플레이어 미감지 시 1 반환) [114]
    • 하나의 고려사항으로 여러 상태의 점수를 계산하기 위해 게임플레이 태그를 활용한다. [124]
      • state gameplay tag를 State.explore, State.chase, State.sleep, State.replenish 등으로 설정한다. [127]
      • Get Score 함수 내에서 게임플레이 태그에 따라 다른 로직을 실행하여 점수를 계산한다. [130]
        • sleep score: is nighttime 변수 확인 [131]
        • replenish score: stamina 값이 40 미만인지 확인 [131]
  4. 고려사항과 기존 방식 혼합:
    • replenish stamina 상태에는 기존의 플로트 값과 응답 곡선 방식을 사용하고, 다른 상태에는 고려사항을 사용하는 등 혼합하여 사용할 수 있다. [145]

1.7. 유틸리티 AI 작동 테스트 및 요약 [47]

  1. 테스트 시나리오:
    • NPC가 탐색(explore) 상태로 시작한다. [96]
    • 플레이어를 감지하면 추격(chase) 상태로 전환한다. [97]
    • 플레이어를 놓치면 다시 탐색 상태로 돌아간다. [98]
    • 스태미나가 떨어지면 replenish stamina 상태로 전환하여 웰(well)에서 회복한다. [98]
    • 밤이 되면 go to sleep 상태로 전환하여 잠을 잔다. [100]
    • 새벽이 되면 다시 활동을 시작하며 사이클이 반복된다. [101]
  2. 핵심 요약:
    • 유틸리티 AI는 Select children with highest utility 행동을 통해 가장 높은 점수의 상태를 선택한다. [152]
    • 가중치(weight)를 사용하여 동일 점수일 때 우선순위를 설정할 수 있다. [153]
    • 상태 진입 후에는 즉시 점수를 다시 계산하지 않으므로, State Tree Events를 사용하여 강제로 재평가하도록 할 수 있다. [154]
    • 유틸리티 점수 계산은 내장 변수, 플로트, 불리언, 로직, 인터벌 등 다양한 방식을 조합하여 복잡하게 구성할 수 있다. [151]
    • 복잡한 행동을 단순한 상태 트리 설정으로 구현하는 데 매우 유용하다. [156]