스마트 오브젝트 만들기

"스마트 오브젝트"는 캐릭터가 해당 경로를 따를 때 캐릭터와의 모든 종류의 특정 상호 작용(기본적으로 경로 따르기 시스템에서 관리하지 않는 모든 동작)을 관리하는 오브젝트에 대한 일반적인 용어입니다. 스마트 오브젝트는 사용자의 시나리오 및 게임 플레이 요구사항, 애니메이션 하위 시스템과 상호 작용하려는 방식 등에 따라 여러 가지 형태를 취할 수 있습니다. 예를 들어 스마트 오브젝트는 다음 기능을 수행할 수 있습니다.

Gameware Navigation SDK에서는 스마트 오브젝트의 기본 구현을 제공하지 않습니다. 대신, 경로 따르기 프로세스 도중 특정 시간대에 캐릭터의 이동을 일부 또는 전체 제어하는 사용자 정의 스마트 오브젝트를 작성하는 데 필요한 모든 도구를 제공합니다.

사용자 고유의 스마트 오브젝트를 작성할 때 코드에서 수행해야 하는 정확한 단계는 만들려는 효과에 따라 크게 다릅니다. 그러나 가장 일반적인 종류의 스마트 오브젝트는 이 페이지에 제공된 대부분의 전략을 사용합니다.

NavTag 설정

NavTag를 사용하여 각 스마트 오브젝트에서 제어할 지형의 영역에 대한 태그를 지정할 수 있습니다. 이는 필수 사항은 아닙니다. NavTag를 사용하지 않고도 사용자 고유의 스마트 오브젝트를 통합할 수 있습니다. 그러나 NavTag는 경로 따르기 시스템에 통합되어 캐릭터가 스마트 오브젝트를 포함하는 경로를 언제 계획하고, 오브젝트에서 제어하는 영역에 언제 접근할지 쉽게 확인할 수 있는 방법을 제공합니다.

일반적인 접근 방법은 NavTag를 사용하여 런타임 시 각 NavData 영역에서 참조하는 스마트 오브젝트의 유형을 확인하는 데 사용할 수 있는 사용자 정의 ID를 포함하는 것입니다. 예를 들어 사다리를 나타내는 NavGraph를 하나의 ID 값으로 태그를 지정하고, 엘리베이터를 나타내는 NavGraph를 다른 값으로 태그를 지정할 수 있습니다.

NavData에서 이러한 NavTag를 정확히 설정하는 방법은 만들려는 오브젝트의 종류에 따라 다릅니다.

NavTag에 대한 자세한 내용은 사용자 정의 데이터로 태그 지정을(를) 참조하십시오.

TagVolume 및 동적 장애물에 대한 자세한 내용은 동적 장애물 및 TagVolume 사용을(를) 참조하십시오.

관심 항목 등록 및 등록 취소

스마트 오브젝트에서 사용하려는 캐릭터를 추적해야 할 수 있습니다. 따라서 스마트 오브젝트의 상태 변경에 캐릭터가 적절하게 응답하도록 할 수 있습니다. 예를 들어 문이 잠기거나 다리가 파괴된 경우 캐릭터가 경로를 다시 계산하여 목표 지점에 이르는 다른 경로를 찾을 수 있도록 할 수 있습니다. 여기에는 일반적으로 스마트 오브젝트를 포함하는 경로를 계획할 때 해당 스마트 오브젝트에 각 캐릭터를 등록하고, 경로가 변경되어 더 이상 오브젝트를 포함하지 않는 경우 등록을 취소하는 작업이 포함됩니다.

해당 경로를 따라 놓인 스마트 오브젝트에 캐릭터를 등록하거나 등록을 취소하려면 스마트 오브젝트 중 하나와 연관된 NavTag로 태그가 지정된 이벤트에 대해 새로 생성된 각 경로를 확인하는 IPathEventListObserver의 사용자 정의 구현을 사용하면 됩니다.

IPathEventListObserver 사용에 대한 자세한 내용은 PathEvent 모니터링을(를) 참조하십시오.

예정된 스마트 오브젝트 확인

캐릭터를 경로를 따를 때 예정된 스마트 오브젝트를 모니터링해야 합니다. 캐릭터가 오브젝트에 가까워지면 스마트 오브젝트에 지침을 묻기 시작해야 합니다.

일반적으로 이는 캐릭터의 경로에서 예정된 다음 PathEvent의 NavTag를 확인하는 것을 의미합니다. 이 작업을 수행하려면 Bot::GetUpcomingEventNavTag()를 호출하면 됩니다. 반환된 NavTag가 스마트 오브젝트와 연관된 ID와 일치하는 경우 스마트 오브젝트에서 현재 횡단 중인 캐릭터를 등록하도록 하고 Bot에 방향을 제공하기 시작할 수 있습니다. 캐릭터의 이동을 즉시 제어하거나, 특정 거리 내에 들 때까지 Bot에서 해당 경로를 계속 따르도록 할 수 있습니다.

제어

결국 스마트 오브젝트는 캐릭터가 오브젝트를 횡단하는 동안, 즉 문을 통과하거나, 사다리를 오르거나, 엘리베이터에 탑승하거나, 특정 애니메이션을 재생하는 등의 제한된 시간 동안 캐릭터의 이동을 제어합니다. 완전한 제어를 원하는 경우 Bot::SetDoValidateCheckPoint()Bot::SetDoComputeTrajectory()를 모두 호출하고 두 메서드에 false를 전달하여 캐릭터에 대한 경로 따르기 시스템을 비활성화해야 합니다.

제어 해제 및 대상 점 이동

캐릭터가 스마트 오브젝트를 성공적으로 통과했거나 스마트 오브젝트에서 수행해야 하는 것으로 결정한 이동을 마친 경우 Bot::SetDoValidateCheckPoint()Bot::SetDoComputeTrajectory()를 모두 다시 호출하고 두 메서드에 true를 전달하여 경로 따르기 시스템을 다시 활성화할 수 있습니다.

경로 따르기를 제어하는 동안에는 대상 점 계산이 비활성화됩니다. 따라서 Bot에서 유지하는 현재 대상 점이 제어 시점의 위치, 즉 캐릭터가 방금 횡단한 스마트 오브젝트의 시작점에 있는 뒤쪽의 경로 이벤트에 그대로 유지됩니다. 따라서 제어를 해제한 경우 캐릭터가 스마트 오브젝트를 횡단하려고 다시 시도하지 않도록 하려면 스마트 오브젝트의 끝을 따라 대상 점을 이동해야 할 수 있습니다. 다음과 같이 이 작업을 수행할 수 있습니다.

// Get the next NavTag along the path from the current position on the path.
// Since the current position is still where it was when the smart object took
// control, we know that this method will return the NavTag at the other end of the
// interval of the path that is controlled by the smart object.
const Kaim::NavTag* smartObjectTag = m_navBot->GetUpcomingEventNavTag();

// This class is a predicate that determines which NavTag we want to move through.
Kaim::NavTagMovePositionOnPathPredicate predicate(smartObjectTag);

// We retrieve the current position on the LivePath.
Kaim::PositionOnLivePath positionOnLivePath = m_navBot->GetProgressOnLivePath();

// This call moves the position on the path forward until the predicate says to stop.
// The NavTagMovePositionOnPathPredicate says to stop when a tag other than the
// smartObjectTag is reached, which will be the PathEvent that lies at the other end
// of the smart object.
m_navBot->MovePositionOnPathForwardToNextEvent( positionOnLivePath, &predicate );

새 경로 요청 처리

스마트 오브젝트의 특성에 따라 스마트 오브젝트를 사용하는 동안 봇이 새 경로를 재계산하도록 할 수도 있고 하지 않도록 할 수도 있습니다. 예를 들어 봇이 엘리베이터를 사용 중이거나, 봇이 점프하거나 뛰어 넘는 동안에는 공중에서 방향을 변경하지 못하도록 새 경로 계산을 차단할 수 있습니다. 그러나 봇이 사다리를 올라가거나 문을 사용하는 동안에는 새 경로를 허용할 수 있습니다. 이에 대한 일반적인 처리 방법은 새 경로를 계산하기 전에 봇 클래스에서 현재 스마트 오브젝트를 확인하는 것입니다.

그러나 일부 경우 경로 찾기 시스템이 NavMesh에 자체적으로 후킹하기에는 너무 먼 NavMesh의 테두리 밖으로 봇을 데려가는 NavGraph에 스마트 오브젝트가 연결될 수 있습니다. 또는 NavGraph의 특정 가장자리에서 강제로 봇이 새 경로를 시작하도록 해야 할 수 있습니다. 이러한 경우 봇이 스마트 오브젝트를 사용하는 동안 여전히 새 경로를 다시 계산할 수 있지만, 스마트 오브젝트를 사용하는 동안 봇의 위치가 NavMesh로 공간화되지 않기 때문에 새 경로를 시작하려는 NavGraph 가장자리 또는 정점으로 AStarQuery를 설정해야 합니다.

마찬가지로 해당 대상이 NavMesh 안에 없는 경우에도 새 경로를 종료할 NavGraph 가장자리 또는 정점으로 AStarQuery를 설정하여 스마트 오브젝트에서 끝나는 경로를 계획할 수 있습니다.

자세한 내용은 AStarQuery 옵션을(를) 참조하십시오.

예제

LabEngine 프로젝트에는 문, 엘리베이터, 사다리, 용암 등 점프해야 하는 여러 유형의 스마트 오브젝트에 대한 예제가 포함되어 있습니다. 이러한 스마트 오브젝트는 Navigation Lab에서 시작할 수 있는 SDK 샘플에서 사용됩니다(Navigation Lab 시작하기 참조). 이러한 오브젝트의 전체 소스 코드가 제공되며, 이를 모델로 사용할 수 있습니다. tools₩LabEngine₩include₩LabEngine₩smartobjectstools₩LabEngine₩src₩smartobjects 디렉토리에 있는 파일을 참조하십시오.