개요
스마트 오브젝트(Smart Objects) 는 레벨 내 배치되는 오브젝트로, AI 에이전트와 플레이어가 상호작용할 수 있습니다. 스마트 오브젝트는 상호작용에 필요한 모든 정보를 포함합니다. 스마트 오브젝트는 글로벌 데이터베이스의 일부이며, 공간 파티셔닝 구조를 사용합니다. 따라서 게임플레이 태그 및 에이전트 주변 검색 영역 같은 필터를 사용하여 런타임에서 스마트 오브젝트를 쿼리할 수 있습니다.
크게 보면 스마트 오브젝트는 예약 시스템을 통해 사용할 수 있는 레벨 내 활동 세트를 나타냅니다.
중요한 것은 스마트 오브젝트에 실행 로직이 없다는 것입니다. 대신 구현에 따라 상호작용을 수행할 수 있도록 인터랙터에 필요한 모든 정보를 제공합니다. 구현 로직은 스마트 오브젝트 대신 각 인터랙터(에이전트 또는 플레이어)가 각자 수행해줍니다.
스마트 오브젝트 엘리먼트
스마트 오브젝트 서브시스템
스마트 오브젝트 서브시스템(SmartObject Subsystem) 은 레벨에서 사용할 수 있는 모든 스마트 오브젝트를 트래킹합니다. 스마트 오브젝트는 액세스 및 트래킹을 위한 서브시스템으로 자동 등록됩니다.
이 서브시스템은 스마트 오브젝트 플러그인이 활성 상태일 때 월드에서 자동 생성됩니다.
스마트 오브젝트 퍼시스턴트 컬렉션
스마트 오브젝트 퍼시스턴트 컬렉션(SmartObject Persistent Collection) 은 런타임에서 로드되는지 여부와 관계없이 항상 시뮬레이션의 일부인 스마트 오브젝트 목록을 보유한, 레벨에 배치된 액터입니다.
레벨에 스마트 오브젝트 퍼시스턴트 컬렉션을 2개 이상 보유하거나 전혀 보유하지 않는 것도 가능합니다. 컬렉션은 스마트 오브젝트의 수명에만 영향을 미치며, 시스템에서 사용되는지 여부에는 영향을 미치지 않습니다.
스마트 오브젝트 컨테이너
스마트 오브젝트 컨테이너(SmartObject Container) 는 스마트 오브젝트 그룹을 트래킹합니다. 스마트 오브젝트 서브시스템과 스마트 오브젝트 퍼시스턴트 컬렉션은 모두 컨테이너를 사용하여 스마트 오브젝트에 특정한 작업을 수행합니다.
스마트 오브젝트 그룹을 병합하는 흔한 예시 중 하나는 퍼시스턴트 컬렉션이 스마트 오브젝트 서브시스템에 추가되는 경우입니다.
스마트 오브젝트 컴포넌트
레벨 내 액터(Actor) 에 스마트 오브젝트 컴포넌트(SmartObject component) 를 추가하면 스마트 오브젝트로 표시할 수 있습니다. 이 컴포넌트는 주어진 스마트 오브젝트 템플릿의 환경설정을 저장하는 스마트 오브젝트 정의 에셋을 가리킵니다.
스마트 오브젝트 컴포넌트를 포함한 액터는 런타임에서 스트리밍(Streaming) 을 사용해 로드 및 언로드할 수 있습니다. 스마트 오브젝트 컴포넌트가 로드된 스마트 오브젝트 퍼시스턴트 컬렉션 중 어느 것에 포함되어 있는 경우, 런타임 인스턴스가 메모리에서 활성 상태를 유지하며 컴포넌트의 스트리밍 상태와 관계없이 시뮬레이션의 일부로 간주됩니다.
스마트 오브젝트 컴포넌트를 포함한 액터가 런타임에서 스폰된 경우, 언로드되면 메모리에서 활성화 상태를 유지하지 않게 됩니다. 이는 컴포넌트가 어떤 스마트 오브젝트 퍼시스턴트 컬렉션의 일부도 아니기 때문입니다.
스마트 오브젝트 정의
스마트 오브젝트 정의(Smart Object Definition) 는 여러 스마트 오브젝트 런타임 인스턴스 간에 공유되는 변경 불가 데이터를 포함하는 데이터 에셋입니다. 스마트 오브젝트 정의에는 사용자 필요 태그, 활동(Activity) 태그, 오브젝트 활성화(Object Activation) 태그, 그리고 스마트 오브젝트와 상호작용하는 데 사용할 수 있는 비헤이비어 정의(Behavior Definitions) 디폴트 세트와 같은 필터링 정보가 저장됩니다.
스마트 오브젝트 정의를 사용하면 에이전트나 플레이어가 구체적인 스마트 오브젝트에 사용할 수 있는 하나 이상의 슬롯이 노출됩니다. 각 슬롯에는 (에디터 배치에서 구운) 부모 앵커를 기준으로 한 상대적 위치 및 회전과 오버라이드 가능한 프로퍼티가 포함됩니다. 오버라이드할 수 있는 대표적인 프로퍼티에는 사용자 필요 태그와 슬롯별 비헤이비어 정의가 있습니다.
스마트 오브젝트 비헤이비어 정의
스마트 오브젝트 비헤이비어 정의(Smart Object Behaviors Definitions) 에는 에이전트나 플레이어가 주어진 인터랙션을 위해 필요로 하는 데이터가 포함됩니다. 현재 사용 가능한 비헤이비어 정의의 종류는 다음과 같습니다.
- 매스 엔티티 비헤이비어(Mass Entity Behavior) - 매스 엔티티가 사용할 수 있는 스마트 오브젝트를 환경설정하는 데 사용되는 데이터가 포함됩니다.
- 게임플레이 비헤이비어(Gameplay Behavior) - 게임플레이 비헤이비어 플러그인이 사용할 수 있는 스마트 오브젝트를 환경설정하는 데 사용되는 데이터가 포함됩니다.
런타임 플로
이 섹션에서는 레벨에서 에이전트가 스마트 오브젝트와 상호작용하는 방식을 알아봅니다.
에이전트 데이터
스마트 오브젝트를 검색하기 위해 에이전트는 하나 이상의 게임플레이 태그를 사용할 수 있으며, 오브젝트에 있는 원하는 태그가 포함된 태그 쿼리(활동 요구사항)를 사용할 수도 있습니다. 이 정보는 레벨에서 일치하는 스마트 오브젝트를 검색할 때 사용됩니다.
스마트 오브젝트 데이터
스마트 오브젝트 정의는 오브젝트를 설명해주는 하나 이상의 활동 태그를 가지고 있습니다. 또한 스마트 오브젝트 정의는 원하는 태그 목록이 있는 태그 쿼리도 가지고 있습니다. 태그 쿼리(Tag Query)는 스마트 오브젝트 사용을 요청하는 사용자가 스마트 오브젝트와 상호작용하는 것이 허용되는지를 결정하는 표현식입니다.
스마트 오브젝트 정의에는 모든 슬롯에 사용할 수 있는 디폴트 비헤이비어 정의 목록이 있습니다. 슬롯에 특정한 비헤이비어 정의가 지정된 경우, 해당 특정 비헤이비어가 디폴트 비헤이비어를 오버라이드합니다.
스마트 오브젝트 검색
-
에이전트는 지정된 간격으로 근처의 스마트 오브젝트를 검색합니다. 검색할 때에는 스마트 오브젝트 서브시스템의 FindSmartObjects 메서드를 호출합니다. 이 메서드에는 사용자 태그, 활동 태그, 비헤이비어 정의 클래스, 검색 영역이 포함됩니다.
-
스마트 오브젝트 서브시스템이 검색 영역 내에서 제공된 모든 필터와 일치하는 모든 스마트 오브젝트를 찾습니다.
-
스마트 오브젝트 서브시스템은 스마트 오브젝트 결과를 에이전트로 반환합니다. 스마트 오브젝트 결과는 일치하는 모든 스마트 오브젝트 핸들과 자유 슬롯을 포함한 구조체 배열입니다.
위 이미지의 비히클 스마트 오브젝트에는 초록색 원으로 표시된 1개의 자유 슬롯이 있습니다.
스마트 오브젝트 독점
-
에이전트는 원하는 스마트 오브젝트 결과를 선택하고 스마트 오브젝트 서브시스템의 ClaimSmartObject 메서드를 호출합니다. 이 메서드는 스마트 오브젝트에서 슬롯을 독점하려고 시도합니다.
-
스마트 오브젝트 서브시스템이 스마트 오브젝트에서 슬롯을 독점하려고 시도합니다.
-
스마트 오브젝트에서 사용 가능한 슬롯이 독점되고, 슬롯의 상태가 독점됨(Claimed) 으로 설정됩니다.
-
스마트 오브젝트 서브시스템이 독점 핸들(Claim Handle) 을 에이전트에 반환합니다.
-
에이전트가 독점 핸들이 유효한지 확인합니다. 유효하다면 독점 시도가 성공했다는 의미입니다. 다음 단계로 넘어갈 수 있습니다. 독점 핸들이 유효하지 않다면 에이전트가 스마트 오브젝트 결과에서 다른 스마트 오브젝트 슬롯의 독점을 시도할 수 있습니다.
독점된 슬롯은 슬롯을 독점한 에이전트가 해제되기 전에는 다른 에이전트에 의해 독점될 수 없습니다.
위의 이미지에서는 슬롯 0이 에이전트에 의해 독점되었습니다.
스마트 오브젝트 접근
-
에이전트가 스마트 오브젝트 서브시스템에서 GetSlotLocation 또는 GetSlotTransform 메서드를 호출하고 독점 핸들을 패스합니다. 이 메서드는 독점된 슬롯의 위치나 트랜스폼을 반환합니다.
또한 사용자가 다음 C++ 코드를 사용하여 슬롯 트랜스폼을 얻을 수도 있습니다.
FSmartObjectSlotView:
FSmartObjectSlotView View = Subsystem->GetSlotView(ClaimHandle.SlotHandle);
const FSmartObjectSlotTransform& SlotTransform = View.GetStateData<FSmartObjectSlotTransform>();
FTransform Transform = SlotTransform.GetTransform();
-
스마트 오브젝트 서브시스템이 독점된 슬롯의 위치나 트랜스폼을 에이전트에 반환합니다.
-
이제 에이전트가 레벨의 슬롯 위치로 이동할 수 있습니다. 에이전트는 원하는 이동 방법을 사용해 목적지에 도달할 수 있습니다.
-
슬롯 위치에 도착한 에이전트가 스마트 오브젝트 서브시스템에서 Use 메서드를 호출하고 독점 핸들을 패스합니다.
-
Use 메서드는 독점된 슬롯의 상태 변경을 트리거합니다. 슬롯의 상태가 독점됨(Claimed) 에서 차지됨(Occupied) 으로 변경됩니다.
-
스마트 오브젝트 서브시스템은 비헤이비어 정의(Behavior Definition) 구조체를 에이전트로 반환합니다. 비헤이비어 정의에는 에이전트가 슬롯 위치에서 원하는 행동을 수행하는 데 필요한 모든 데이터가 포함되어 있습니다.
위 이미지에서는 에이전트가 슬롯에 도착해 원하는 행동을 수행하기 시작합니다. 이제 차지된 상태가 된 슬롯이 빨간색 원으로 표시되어 있습니다.
스마트 오브젝트 해제
-
에이전트가 비헤이비어 정의에 설명된 대로 원하는 행동을 수행합니다.
-
행동이 완료되거나 중단되면 에이전트가 스마트 오브젝트 서브시스템에서 독점 핸들로 Release 메서드를 호출합니다.
-
스마트 오브젝트 서브시스템이 슬롯 상태를 차지됨(Occupied) 에서 자유(Free) 로 변경합니다.
-
이제 에이전트는 자유롭게 다른 태스크를 수행하거나 다른 스마트 오브젝트를 검색할 수 있습니다.
독점된 슬롯은 에이전트가 해제해야 합니다. 해제는 비헤이비어가 완료되거나 중단되면 가능합니다.
과정 중단
위에서 설명한 과정은 에이전트나 스마트 오브젝트에 의해 언제든지 중단될 수 있습니다.
상태가 변경된 스마트 오브젝트는 자동으로 독점되거나 차지된 모든 슬롯을 해제하고, OnSlotInvalidatedDelegate 콜백을 통해 해당하는 에이전트에게 이 사실을 고지합니다. 대표적인 예시로는 게임플레이 도중 스마트 오브젝트가 파괴되는 경우가 있습니다.
에이전트도 이유와 관계없이 언제든지 이 과정을 중단할 수 있습니다. 이 시나리오에서 에이전트는 다른 에이전트가 독점할 수 있도록 슬롯을 해제해야 합니다. 흔한 예로는 에이전트가 죽거나 우선순위가 더 높은 다른 작업을 수행하는 경우가 있습니다.