[Unity] Input position is { Infinity }... 에러 해결 본문
출근 하자마자 클라이언트 앱이 뻗는 이슈를 제보받았다.
발생 시점을 조사해보니
캐릭터가 다리를 지나가면 해당 다리가 뒤따라오며 무너지는 연출이 발생하는 시점에서
간헐적으로 해당 이슈가 발생했다.
에러 구문 중 핵심은 다음과 같다.
transform.position assign attempt for 'monster_agent(Clone)' is not valid. Input position is { Infinity, Infinity, Infinity }.
UnityEngine.AI.NavMeshAgent:Warp(Vector3)
...
...
CalculatePolygonPath: invalid input position(s). Source position { Infinity, Infinity, Infinity }. Target position { -200.169983, 20.000000, 24.005482 }
UnityEngine.AI.NavMesh:CalculatePath(Vector3, Vector3, Int32, NavMeshPath)
transform형의 position이나 eulerAngles 등의 요소에
무한대(infinity)값을 대입하면 오류가 발생한다.
Input Position이 Infinify가 될 경우가 발생할 수 있는 경우를 찾아보았다
Unity Documentation에서 다음의 내용을 발견했고, 왠지 해당 사항이 들어맞을 것 같았다
• If the agent is not mapped to the navmesh (e.g. Scene has no navmesh) - returns a position at infinity.
(출처 : https://docs.unity3d.com/ScriptReference/AI.NavMeshAgent-destination.html)
좀 더 살펴보니 원인은 이랬다.
다리가 무너지는 연출과 함께 다리 파편의 NavMesh가 분리되는데, 이때 우연히 몬스터 에이전트가 분리되는 다리 파편 위에 존재할경우 이동할 목적지 매쉬가 끊겨 없게된다.
그래서 LateUpdate에서 다음 목적지를 찾지만, 존재하지 않아 Infinify값을 반환하게 되는 것이다.
단순히 Infinity값을 알아내 처리하기 위해선 다음의 처리를 하면 간단하게 해결은 가능하다.
if(float.IsInfinity(targetPosX))
{
targetPosX = 0.0f;
}
하지만 원론적으로 해당 상황이 발생하는 것을 막게끔 처리하자.