스마트 오브젝트 개요

스마트 오브젝트는 예약 시스템을 통해 사용할 수 있는 레벨 내 활동입니다.

Choose your operating system:

Windows

macOS

Linux

개요

스마트 오브젝트(Smart Objects) 는 레벨 내 배치되는 오브젝트로, AI 에이전트와 플레이어가 상호작용할 수 있습니다. 스마트 오브젝트는 상호작용에 필요한 모든 정보를 포함합니다.

스마트 오브젝트는 글로벌 데이터베이스의 일부이며, 공간 파티셔닝 구조를 사용합니다. 따라서 위치, 에이전트와의 근접성, 태그와 같은 필터를 사용하여 런타임에서 쿼리가 가능합니다.

크게 보면 스마트 오브젝트는 예약 시스템을 통해 사용할 수 있는 레벨 내 활동 세트를 나타냅니다. 중요한 것은 스마트 오브젝트에 실행 로직이 없다는 것입니다. 대신 구현에 따라 상호작용을 수행할 수 있도록 인터랙터에 필요한 모든 정보를 제공합니다. 구현 로직은 스마트 오브젝트 대신 각 인터랙터(에이전트 또는 플레이어)가 각자 수행해줍니다.

스마트 오브젝트 엘리먼트

스마트 오브젝트 서브시스템

스마트 오브젝트 서브시스템(SmartObject Subsystem) 은 레벨에서 사용할 수 있는 모든 스마트 오브젝트를 트래킹합니다. 이 서브시스템은 스마트 오브젝트 컴포넌트와 컬렉션 사이를 연결해줍니다. 스마트 오브젝트 서브시스템은 스마트 오브젝트 플러그인이 활성화되면 레벨에 자동으로 생성되고, 스마트 오브젝트 컬렉션이 없다면 컬렉션을 만듭니다.

스마트 오브젝트 컬렉션

스마트 오브젝트 컬렉션(SmartObject collection) 은 레벨과 관련된 모든 스마트 오브젝트 컴포넌트의 목록을 포함하고 있습니다. 컬렉션은 공유된 모든 환경설정을 포함하며, 로드된 영역 외부의 효율적인 대규모 월드 시뮬레이션을 위해 런타임에서 스마트 오브젝트 인스턴스를 생성하는 데 사용됩니다.

레벨에는 하나의 스마트 오브젝트 컬렉션만 존재합니다.

스마트 오브젝트 컴포넌트

레벨 내 액터(Actor)스마트 오브젝트 컴포넌트(SmartObject component) 를 추가하면 스마트 오브젝트로 변환할 수 있습니다. 이 컴포넌트는 주어진 스마트 오브젝트 템플릿의 환경설정을 구성하고 저장합니다.

스마트 오브젝트 컴포넌트를 포함한 액터는 런타임에서 월드 파티션(World Partition) 이나 스트리밍(Streaming) 을 사용해 로드 및 언로드할 수 있습니다. 스마트 오브젝트 컴포넌트가 퍼시스턴트 월드의 일부인 경우, 런타임 인스턴스가 메모리에서 활성화 상태를 유지하며 시뮬레이션의 일부로 간주됩니다. 스마트 오브젝트 컴포넌트를 포함한 액터가 런타임에서 스폰된 경우, 언로드되면 메모리에서 활성화 상태를 유지하지 않게 됩니다.

스마트 오브젝트 정의

스마트 오브젝트 정의(Smart Object Definition) 는 스마트 오브젝트 런타임 인스턴스 전체 개수에 해당하는 여러 인스턴스 사이에서 공유되는 변경 불가 데이터를 포함하는 데이터 구조체입니다. 스마트 오브젝트 정의는 사용자 필요 태그, 설명 태그, 인터랙션 실행을 위한 디폴트 비헤이비어와 같은 필터링 정보를 저장합니다.

스마트 오브젝트 정의를 사용하면 에이전트나 플레이어가 구체적인 스마트 오브젝트에 사용할 수 있는 하나 이상의 가용 슬롯이 노출됩니다. 각 슬롯에는 (에디터 배치에서 구운) 부모 앵커를 기준으로 한 상대적 위치 및 회전과 오버라이드 가능한 프로퍼티가 포함됩니다. 오버라이드할 수 있는 대표적인 프로퍼티에는 사용자 필요 태그와 슬롯별 비헤이비어가 있습니다.

스마트 오브젝트 비헤이비어 정의

스마트 오브젝트 비헤이비어 정의(Smart Object Behaviors Definitions) 에는 에이전트나 플레이어가 주어진 인터랙션을 위해 필요로 하는 데이터가 포함됩니다. 일반적인 비헤이비어 예시로는 게임플레이 비헤이비어(Gameplay Behavior) , 플레이어 비헤이비어(Player Behavior) , 매스엔티티 비헤이비어(MassEntity Behavior) 가 있습니다. 게임플레이 비헤이비어는 블루프린트에서 직접 구현할 수 있습니다.

런타임 플로

이 섹션에서는 레벨에서 에이전트가 스마트 오브젝트와 상호작용하는 방식을 알아봅니다.

에이전트 데이터

에이전트가 스마트 오브젝트를 검색하려면 하나 이상의 사용자 태그와 오브젝트 태그 목록이 필요합니다. 이 정보는 레벨에서 일치하는 스마트 오브젝트를 검색할 때 사용됩니다.

스마트 오브젝트 데이터

스마트 오브젝트는 오브젝트를 설명해주는 하나 이상의 오브젝트 태그(object tags) 를 가지고 있습니다. 또한, 사용자 태그 목록과 태그 쿼리도 포함하고 있습니다. 태그 쿼리는 스마트 오브젝트 사용을 요청하는 사용자가 스마트 오브젝트와 상호작용하는 것이 허용되는지를 결정하는 표현식입니다.

스마트 오브젝트에 있는 비헤이비어 클래스(Behavior Class) 에는 스마트 오브젝트와 상호작용을 시작한 사용자가 이용하게 될 비헤이비어 정의가 포함되어 있습니다.

스마트 오브젝트 검색

  1. 에이전트는 지정된 간격으로 근처의 스마트 오브젝트를 검색합니다. 검색할 때에는 스마트 오브젝트 서브시스템의 FindSmartObjects 메서드를 호출합니다. 이 메서드에는 사용자 태그, 오브젝트 태그, 비헤이비어 클래스, 검색 영역이 포함됩니다.

  2. 스마트 오브젝트 서브시스템이 검색 영역 내에서 오브젝트 태그와 일치하는 모든 스마트 오브젝트를 찾습니다.

  3. 각 스마트 오브젝트는 사용자 태그로 태그 쿼리를 실행하여 일치하는 내용이 있는지 확인하고, 그 결과를 스마트 오브젝트 서브시스템에 전송합니다.

  4. 스마트 오브젝트 서브시스템은 스마트 오브젝트 결과를 에이전트로 반환합니다. 스마트 오브젝트 결과는 일치하는 모든 스마트 오브젝트 ID와 자유 슬롯을 포함한 구조체 배열입니다.

    자유 슬롯이 두 개인 스마트 오브젝트

    위 이미지의 벤치 스마트 오브젝트에는 회색 원으로 표시된 두 개의 자유 슬롯이 있습니다.

스마트 오브젝트 독점

  1. 에이전트는 원하는 스마트 오브젝트 결과를 선택하고 스마트 오브젝트 서브시스템의 ClaimSmartObject 메서드를 호출합니다. 이 메서드는 스마트 오브젝트에서 사용 가능한 슬롯을 독점하려고 시도합니다.

  2. 스마트 오브젝트 서브시스템이 스마트 오브젝트에서 사용 가능한 슬롯을 독점하려고 시도합니다.

  3. 스마트 오브젝트에서 사용 가능한 슬롯이 독점되고, 슬롯의 상태가 독점됨(Claimed) 으로 설정됩니다. 스마트 오브젝트 서브시스템으로 확인이 전송됩니다.

  4. 스마트 오브젝트 서브시스템이 독점 핸들(Claim Handle) 을 에이전트에 반환합니다.

  5. 에이전트가 독점 핸들이 유효한지 확인합니다. 유효하다면 독점 시도가 성공했다는 의미입니다. 다음 단계로 넘어갈 수 있습니다. 독점 핸들이 유효하지 않다면 에이전트가 스마트 오브젝트 결과에서 다른 스마트 오브젝트의 독점을 시도할 수 있습니다.

    독점된 슬롯은 현재 슬롯을 차지한 에이전트가 해제되기 전에는 다른 에이전트에 의해 독점될 수 없습니다.

    독점 슬롯이 두 개인 스마트 오브젝트

    위 이미지에서는 에이전트가 독점된 슬롯으로 이동하며 벤치 스마트 오브젝트에 접근합니다.

스마트 오브젝트 접근

  1. 에이전트가 스마트 오브젝트 서브시스템에서 GetSlotLocation 또는 GetSlotTransform 메서드를 호출하고 독점 핸들을 패스합니다. 이 메서드는 독점된 슬롯의 위치나 트랜스폼을 반환합니다.

  2. 스마트 오브젝트 서브시스템이 독점된 슬롯의 위치나 트랜스폼을 에이전트에 반환합니다.

  3. 이제 에이전트가 레벨의 슬롯 위치로 이동할 수 있습니다. 에이전트는 원하는 이동 방법을 사용해 목적지에 도달할 수 있습니다.

  4. 슬롯 위치에 도착한 에이전트가 스마트 오브젝트 서브시스템에서 UseSlot 메서드를 호출하고 독점 핸들을 패스합니다.

  5. 스마트 오브젝트 서브시스템은 비헤이비어 정의(Behavior Definition) 구조체를 에이전트로 반환합니다. 비헤이비어 정의에는 에이전트가 슬롯 위치에서 원하는 행동을 수행하는 데 필요한 모든 데이터가 포함되어 있습니다.

  6. UseSlot 메서드는 독점된 슬롯의 상태 변경을 트리거합니다. 슬롯의 상태가 독점됨(Claimed) 에서 차지됨(Occupied) 으로 변경됩니다.

    차지된 슬롯과 독점된 슬롯이 있는 스마트 오브젝트

    위 이미지에서는 에이전트가 슬롯에 도착해 원하는 행동을 수행하기 시작합니다. 이제 차지된 상태가 된 슬롯이 빨간색 원으로 표시되어 있습니다.

스마트 오브젝트 해제

  1. 에이전트가 비헤이비어 정의에 설명된 대로 원하는 행동을 수행합니다.

  2. 행동이 완료되거나 중단되면 에이전트가 스마트 오브젝트 서브시스템에서 독점 핸들로 ReleaseSmartObject 메서드를 호출합니다.

  3. 스마트 오브젝트 서브시스템이 슬롯 상태를 차지됨(Occupied) 에서 자유(Free) 로 변경합니다.

  4. 이제 에이전트는 자유롭게 다른 행동을 수행하거나 다른 스마트 오브젝트를 검색할 수 있습니다.

    독점된 슬롯은 에이전트가 해제해야 합니다. 해제는 비헤이비어가 완료되거나 중단되면 가능합니다.

과정 중단

위에서 설명한 과정은 에이전트나 스마트 오브젝트에 의해 언제든지 중단될 수 있습니다.

상태가 변경된 스마트 오브젝트는 자동으로 독점되거나 차지된 모든 슬롯을 해제하고, OnSlotInvalidatedDelegate 콜백을 통해 해당하는 에이전트에게 이 사실을 고지합니다. 대표적인 예시로는 게임플레이 도중 스마트 오브젝트가 파괴되는 경우가 있습니다.

에이전트도 이유와 관계없이 언제든지 이 과정을 중단할 수 있습니다. 이 시나리오에서 에이전트는 다른 에이전트가 독점할 수 있도록 슬롯을 해제해야 합니다. 흔한 예로는 에이전트가 죽거나 우선순위가 더 높은 다른 작업을 수행하는 경우가 있습니다.