1. AI 캐릭터의 환경 인지 및 상호작용 구현: 상태 트리와 EQS 활용 [0]

thumbnail AI 캐릭터가 주변 환경의 스마트 오브젝트와 효율적으로 상호작용하도록 구현하는 방법을 다룬다. 특히 EQS(Environmental Query System)를 활용하여 AI가 주변 오브젝트를 탐색하고, 상태 트리(State Tree)를 통해 AI의 행동 로직을 관리하는 과정을 설명한다.

1.1. AI 캐릭터의 움직임 문제 해결 [0]

  1. 캐릭터의 떨림(jittering) 현상 원인 및 해결 방안 [0]
    • 캐릭터의 떨림은 RVO(Reciprocal Velocity Obstacles) 회피 기능으로 인해 발생할 수 있으며, 이는 프로젝트 설정의 Crowd Manager에서 제어된다. [1]
    • Crowd Manager의 RVO 회피 설정을 조정하거나, AI 컨트롤러를 일반 AI 컨트롤러로 재분류한 후 캐릭터 이동 컴포넌트의 RVO 회피를 사용하는 방법이 있다. [4]
    • 캐릭터 이동 컴포넌트에서 RVO 회피 관련 설정은 회피 고려 반경(avoidance consideration radius)과 가중치(weight)만 제어할 수 있다. [5]
    • 두 가지 RVO 회피 기능을 동시에 활성화하는 것은 성능 저하만 초래할 뿐 효과가 없을 수 있다. [6]
    • 회전 속도(rotation rate)가 너무 높으면 떨림 현상이 발생할 수 있으며, 이를 낮추면 개선된다. 다만, 너무 낮추면 캐릭터 움직임과 동기화가 맞지 않을 수 있다. [9]

1.2. 스마트 오브젝트와 EQS 설정 [12]

  1. 스마트 오브젝트의 기본 구조 및 EQS 쿼리 설정 [12]
    • EQS(Environmental Query System)를 사용하여 스마트 오브젝트를 탐색하는 과정을 시작한다. [13]
    • 스마트 오브젝트는 상속 구조를 활용하여 마스터 스마트 오브젝트(SO Master Smart Object)를 만들고, 이를 기반으로 다양한 종류의 스마트 오브젝트(예: 벤치)를 자식 블루프린트로 생성한다. [17]
    • 메모리 자동 로딩을 방지하기 위해 스마트 오브젝트의 정적 메시(static mesh)를 비우고 수동으로 설정한다. [20]
    • 충돌 프리셋(Collision presets)을 커스텀하거나 기존 설정을 수정하여 스마트 오브젝트의 충돌 방식을 정의할 수 있다. [22]
  2. 유연한 스마트 오브젝트 구현을 위한 일반 스마트 오브젝트 정의 [27]
    • 다양한 오브젝트에 동일한 일반 스마트 오브젝트 정의(general smart object definition)를 적용하여 유연성을 확보할 수 있다. [27]
    • 일반 스마트 오브젝트 정의에서 상태 트리(state tree)를 파라미터로 프로모션하여 동적으로 변경할 수 있다. [29]
    • 이 과정에서 에디터 버그로 인해 프로젝트가 충돌하는 경우가 발생할 수 있다. [32]
  3. EQS 쿼리 설정 및 최적화 [35]
    • EQS 쿼리를 설정하기 위해 EQS 쿼리 템플릿(EQS Query Template)을 생성한다. [15]
    • 기본 FindSmartObjects 함수는 스마트 오브젝트 슬롯의 위치만 반환하므로, 액터(Actor)를 쿼리하여 스마트 오브젝트 액터를 직접 찾는 방식을 사용한다. [41]
    • 검색 반경(search radius)을 설정하고, 이를 시각적으로 확인하여 적절한 값을 결정한다. [46]
    • 쿼리 파라미터(query parameter)를 사용하여 검색 반경과 같은 플로트(float) 값을 외부에서 전달할 수 있다. [48]
    • 검색 중심(search center)은 쿼리하는 액터(querier)이며, 검색 액터 클래스(searched actor class)는 BP_SO_Master와 같은 스마트 오브젝트 마스터 클래스로 설정한다. [50]
    • 거리 필터링(distance filtering)을 통해 특정 범위 내의 오브젝트만 점수화할 수 있다. 선형(linear) 방식은 멀수록 높은 점수를, 역선형(inverse linear) 방식은 가까울수록 높은 점수를 부여한다. [52]
    • 검색 반경 설정으로 인해 거리 필터링이 불필요할 수 있으며, 점수화만으로도 충분할 수 있다. [58]
  4. EQS 테스트를 위한 환경 설정 [60]
    • 닷 프로덕트(Dot product)를 사용하여 스마트 오브젝트 액터의 방향이 쿼리하는 액터와 얼마나 일치하는지 점수화할 수 있다. [60]
    • 라인 A는 시작점, 투 모드(two mode)는 한 위치에서 다른 위치로의 이동을 의미한다. 쿼리하는 액터에서 오브젝트까지의 방향을 설정한다. [62]
    • EQS 테스트를 위해 EQS Testing Pawn을 생성하고, EQS 쿼리 템플릿을 할당한다. [67]
    • 닷 프로덕트의 회전(rotation) 설정을 2D로 하여 성능을 최적화한다. [80]
    • 테스트 결과, 캐릭터가 오브젝트를 향하는 방향에 따라 점수가 달라지며, 이는 캐릭터가 오브젝트를 향해 이동하도록 유도하는 데 사용된다. [85]
    • 닷 프로덕트 필터링은 선택 사항이며, 비활성화할 수도 있다. [86]

1.3. 상태 트리와 AI 컨트롤러 연동 및 문제 해결 [90]

  1. 상태 트리 AI 컴포넌트 설정 및 스마트 오브젝트 태스크 연동 [90]
    • 스마트 오브젝트를 상태 트리 AI 컴포넌트(State Tree AI Component)로 이동시킨다. [90]
    • 기존 상태 트리 컴포넌트(State Tree Component)를 상태 트리 AI 컴포넌트로 변경해야 AI 컨트롤러에서 정상적으로 인식된다. [95]
    • Use Smart Object 태스크를 AI 컨트롤러에서 직접 가져오도록 변경하여 효율성을 높인다. [99]
  2. Find Smart Object 함수의 버그 우회 및 해결 방안 [104]
    • Find Smart Object 태스크에서 Claim Handle이 제대로 전달되지 않는 버그가 발생할 수 있다. [105]
    • 이 버그를 해결하기 위해 AI 컨트롤러에 Claim Handle을 저장하고, Use Smart Object 호출 시 AI 컨트롤러에서 참조하는 방식을 사용한다. [108]
    • Query Smart Object라는 새로운 상태 트리 태스크를 생성하여 EQS 쿼리를 실행한다. [116]
    • Run EQS Query 노드를 사용하여 생성한 EQS 쿼리를 실행하고, Single Best 옵션을 선택하여 최적의 결과 하나만 가져온다. [123]
    • EQS 쿼리 완료 시 On Query Finished 이벤트 디스패처를 사용하여 결과를 처리한다. [130]
    • 쿼리 결과가 성공했는지 실패했는지 스위치 노드(switch node)를 통해 확인하고, 실패 시 태스크를 실패 처리한다. [132]
    • Get Query Results as Actors 노드를 통해 쿼리 결과를 액터 배열로 가져온다. [135]
    • Find Smart Objects 액터 노드를 사용하여 스마트 오브젝트를 찾고, 결과에 대한 브랜치(branch) 처리를 통해 오류를 방지한다. [145]
    • User Actor를 AI 컨트롤러로 설정하고, Should Finish Task 및 Filter를 변수로 프로모션하여 상태 트리에서 제어할 수 있도록 한다. [150]
  3. 블루프린트 인터페이스를 활용한 Claim Handle 전달 문제 해결 [190]
    • Find Smart Object 함수에서 Claim Handle이 제대로 설정되지 않는 버그가 지속적으로 발생한다. [190]
    • 이 문제를 해결하기 위해 BPI_AIC_NPC라는 블루프린트 인터페이스(Blueprint Interface)를 생성한다. [206]
    • 인터페이스에 Set Claim Handle 및 Get Claim Handle 함수를 추가하여 Claim Handle을 전달하고 가져온다. [207]
    • AI 컨트롤러에 Set Claim Handle 메시지를 호출하여 Claim Handle을 설정한다. [211]
    • Is Valid 체크를 통해 Claim Handle이 유효한지 확인한 후 사용해야 한다. 이 타이밍 문제가 버그의 원인 중 하나로 추정된다. [227]
    • 이러한 과정을 통해 AI 캐릭터가 스마트 오브젝트를 성공적으로 클레임(claim)하고 상호작용할 수 있게 된다. [233]

1.4. 최종 결과 및 향후 계획 [234]

  1. 구현 결과 및 향후 개선 방향 [234]
    • 상태 트리를 AI 컴포넌트 컨트롤러로 성공적으로 이전하고, 스마트 오브젝트 쿼리를 구현했다. [235]
    • Find Smart Object 함수의 버그가 수정될 때까지 현재의 블루프린트 인터페이스를 활용한 방식이 최선의 해결책이다. [237]
    • Find Smart Object 함수가 사용자 액터 대신 월드 오리진을 기준으로 쿼리하는 것으로 보이는 문제점에 대한 의문이 제기된다. [239]
    • 다음 영상에서는 AI 캐릭터가 무작위로 돌아다니고, 일정 확률로 스마트 오브젝트를 탐색하도록 기능을 확장할 예정이다. [247]