NavMesh의 AgentTypeID가 직관적이지 않은 경우

Unity에서 사용할 수 있는 NavMesh를 사용하면 다른 매개 변수가 있는 Agent를 만들 수 있습니다. Inspector에서 AgentType을 선택할 수 있으면 알기 쉬운 이름으로 표시되지만 스크립트에서 AgentType은 이름으로 지정할 수 없으며 대신 AgentTypeID를 사용해야합니다. 이 AgentTypeID 가 조금 까다롭기 때문에, 그 배고파서에 기사를 씁니다.

문제점



NavMesh의 공식 확장인 NavMeshComponents의 샘플을 만졌을 때 발생했습니다.Examples/Scenes/5_sliding_window_terrain 라는 장면은, NavMeshBuilder 클래스를 사용하는 것으로 Agent의 주위에 런타임에 동적으로 NavMesh 를 작성할 수 있는 예를 나타내고 있습니다만, AgentType 가 Humanoid 의 Agent 밖에 존재하지 않았기 때문에 , 여기에 새로운 AgentType 를 추가하면 어떻게 될까 하는 기분이 되어, 시도해 보기로 했습니다.

AgentTypes는 본 목적으로 매우 Enum입니다. 실제 기본값으로 설정된 Humanoid라는 AgentType에 해당하는 ID는 0입니다.


Examples/Scripts/LocalNavMeshBuilder.cs
// 60行目
var defaultBuildSettings = NavMesh.GetSettingsByID(0);

그래서, Humanoid 밑에 있는 Ogre 에 대응하는 ID 는 하나 증분되어 1 가 되는 것이라고 생각하네요. 그래서 위의 스크립트 ID를 1로 다시 쓰고 장면의 Agent를 Orge로 설정했지만 Failed to create agent because it is not close enough to the NavMesh라는 경고가 표시되어 제대로 작동하지 않았습니다.

조사한 결과, Ogre에 대응하는 NavMesh가 올바르게 작성되지 않은 것을 알았고, Ogre에 대응하는 AgentTypeID가 1가 아닌 것인지를 알았습니다.

해당 AgentTypeID를 얻는 방법



여러가지 시도해 보았습니다만, 최종적으로 이하의 방법으로 AgentType 에 대응하는 ID 를 알 수 있습니다. 사전 형식으로 저장하면 언제든지 AgentType 이름에서 ID를 얻을 수 있습니다.
(회전 쓰는 방법으로 되어 있는 것은 딱 좋은 API가 없었기 때문입니다)
Dictionary<string, int> agentTypeIdDict = new private Dictionary<string, int>(); 
for (var i = 0; i < NavMesh.GetSettingsCount(); i++)
{
    var id = NavMesh.GetSettingsByIndex(i).agentTypeID;
    var name = NavMesh.GetSettingsNameFromID(id);
    agentTypeIdDict.Add(name, id);
}

여기에서 얻은 ID를 지정하면 경고가 사라지고 Ogre Agent도 올바르게 작동했습니다.

마지막으로



결과적으로 자신의 환경에서 Ogre 에 해당하는 ID 는 -1372625422 이었습니다! 전혀 예상과 달랐어요! ! ! ! !

좋은 웹페이지 즐겨찾기