다중 데이터베이스 사용

이 페이지에서는 단일 World에서 동시에 여러 Database를 사용하는 것에 대한 세부 정보를 일부 제공합니다.

다중 데이터베이스를 사용하는 시기

다음 중 하나에 해당하는 여러 가지 다른 유형의 캐릭터가 있는 경우에만 다중 Databases를 사용해야 합니다.

이러한 경우 두 유형의 캐릭터에 있어서 이동할 수 있는 지세 영역의 차이는 두 세트의 NavData를 사용해야 할 만큼 다르며, 이것은 런타임 시 게임에서 서로 다른 NavData 세트를 관리하기 위해 두 개의 Databases를 사용한다는 것을 암시합니다.

데이터베이스 공유 시기

일반적으로 지세에 대해 사전에 생성한 정적 NavData는 Gameware Navigation을 사용할 때 런타임 메모리를 가장 많이 소모합니다. 그러므로 불필요한 복제를 방지하기 위해 가능할 때마다(예: 캐릭터 간의 차이가 런타임 시 눈에 띄게 이상한 동작을 유발하지 않을 만큼 작은 경우) 캐릭터가 동일한 NavData를 공유하도록 할 수 있습니다.

여러 가지 다른 유형의 캐릭터에 대해 단일 Database를 공유하기로 선택하는 경우 가장 큰 캐릭터의 반지름 및 높이를 사용하여 데이터를 생성하는 것이 가장 안전합니다. 이는 사람 및 거인의 사례를 고려해 보면 쉽게 명백해집니다.

  • 사람의 치수를 사용하여 데이터를 생성하는 경우 NavMesh의 테두리는 정적 형상으로부터 대략 사람의 반지름과 동일한 거리에 있습니다. 따라서 런타임 시 거인이 자체 반지름보다 정적 형상에 더 가깝게 지나가는 경로를 계획할 수 있으며 그럴 경우 충돌할 수 있습니다.
  • 거인의 치수를 사용하여 데이터를 생성하는 경우 NavMesh의 테두리는 정적 형상으로부터 대략 거인의 반지름과 동일한 거리에 있습니다. 경로 찾기 및 경로 따르기에서 두 캐릭터 모두 이 방법을 사용하는 것이 안전합니다. 그러나 더 작은 캐릭터들이 위에 표시된 좁은 복도, 작은 은신처 등과 같이 일반적인 경우에는 도달할 수 있는 일부 지세 영역에 액세스하지 못할 수 있습니다.

이와 같은 경우 한편으로는 NavData를 공유하여 런타임 메모리를 절약하는 것과 다른 한편으로는 정확한 치수로 각 캐릭터의 NavData를 조정하여 경로 찾기 및 경로 따르기 현실감을 높이는 것 중 하나만 선택해야 합니다. 궁극적으로 게임에서 우선 순위를 정하는 것은 사용자가 결정해야 합니다.

다중 데이터베이스 설정

World에서 다중 Databases 설정은 모든 것을 여러 번 해야 한다는 점을 제외하고 개념적으로 단일 Database 설정과 동일합니다.

유일한 실제 차이점은 각 유형의 캐릭터에 대한 NavData를 올바른 Database에 추가하도록 자산 파이프라인에 대한 과제가 추가된 것입니다.

NavData 호환성

Database에는 해당 데이터 세트의 일관성을 보장하고 다른 캐릭터에 대해 생성된 NavData에서 로드하지 못하도록 방지하기 위한 메커니즘이 있습니다. Database가 NavData를 로드하면 추가 NavData가 기존 NavData와 동일한 구성 매개변수 세트로 생성되지 않는 한 추가 NavData를 로드하지 않습니다.

NavData 오브젝트를 Database에 추가하기 전에 Database::IsCompatibleWith()를 호출하고 NavData 오브젝트를 전달하여 해당 데이터가 이미 존재하는 데이터와 일치하는지 테스트할 수 있습니다. 이 메서드가 False를 반환하면 해당 NavData를 해당 Database에 추가하려는 시도는 실패합니다.

데이터베이스 바인딩

기본적으로 봇이나 장애물과 같은 새 WorldElement를 월드에 추가할 때마다 해당 오브젝트가 월드의 모든 데이터베이스로 공간화됩니다. 이렇게 하면 모든 데이터베이스에서 동일한 방식으로 새 오브젝트를 고려하도록 할 수 있습니다. 예를 들면 다음과 같습니다.

하지만 경우에 따라 이 기본 동작을 원하지 않을 수 있습니다. 그 대신 새 오브젝트가 적용되는 데이터베이스를 제한할 수 있습니다. 예를 들면 다음과 같습니다.

Bot, BoxObstacle, CylinderObstacle, TagVolume 또는 PointOfInterest를 만들 때마다 새 오브젝트를 고려해야 하는 데이터베이스를 지정할 수 있습니다.

이러한 종류의 각 오브젝트를 초기화하기 위해 사용하는 구성 오브젝트에는 m_databaseBinding 구성원이 있으며 이를 통해 DatabaseBinding 클래스의 인스턴스를 유지합니다. 오브젝트를 초기화하기 전에 새 DatabaseBinding을 만들고 선택한 Databases에 포인터로 설정하고 DatabaseBinding을 가리키도록 m_databaseBinding 구성원을 설정할 수 있습니다. 예를 들면 다음과 같습니다.

Kaim::BotInitConfig botInitConfig;
...
m_databaseBinding = *KY_NEW Kaim::DatabaseBinding;
m_databaseBinding->AddDataBase(world->GetDatabase(0));
m_databaseBinding->AddDataBase(world->GetDatabase(2));
botInitConfig.m_databaseBinding = m_databaseBinding;

m_navBot->Init(botInitConfig);