말감로그

[Unity] NavMeshAgent Wrap 본문

Unity

[Unity] NavMeshAgent Wrap

habbn 2025. 7. 2. 16:36
728x90

 

드라이브스루 시스템 구현 중 차를 스폰하는 과정에서 CarSpawnPos가 아닌 엉뚱한 곳에서 차가 생성되는 문제가 발생했다.

 

    private IEnumerator CoSpawnCar()
    {
        while (true)
        {
            yield return new WaitForSeconds(2f);

            if (_queueCars.Count >= _queuePoints.Count)
                continue;

            GameObject go = GameManager.Instance.SpawnCar();
            go.transform.position = CarSpawnPos.position;

            Transform dest = _queuePoints.Last();

            CarController car = go.GetComponent<CarController>();
            car.CurrentDestQueueIndex = _queuePoints.Count - 1;
            car.CarState = Define.ECarState.Queuing;
            car.SetDestination(dest.position, () =>
            {
                car.transform.rotation = dest.rotation;
            });

            _queueCars.Add(car);
        }
    }

 

차를 스폰하는 코루틴 안에서 새로 생성되는 차의 포지션을 CarSpawnPos의 위치로 설정해주었는데 이것이 원인이었다.

이 방식으로 위치를 설정해주면 transform.position만 변경되고, NavMeshAgent는 이전 위치에 그대로 남아있어서 NavMeshAgent의 내부 경로 계산 기준 위치와 실제 위치가 불일치하게 되기 때문이다.

 

해결방법 -> NavMeshAgent.Warp() 사용

GameObject go = GameManager.Instance.SpawnCar();
CarController car = go.GetComponent<CarController>();
car.GetComponent<NavMeshAgent>().Warp(CarSpawnPos.position);

 

Warp()를 사용해서 내부 NavMesh 상태를 갱신해주면 된다 내부 경로의 위치가 변경되기 때문에 일치하게 된다.

 

NavMeshAgent.Warp()
NavMeshAgent를 새로운 위치로 순간이동시킬 때 사용하는 함수

 


 

* Unity에서 NavMeshAgent가 하는 일

1. 현재 위치를 NavMesh 위에서 확인

2. 목적지까지 갈 수 있는 경로 계산

3. 장애물 피해서 이동 처리

 

즉, 우리가 SetDestination()만 호출하면 나머지는 NavMeshAgent가 알아서 처리

이때 중요한 건 Agent는 "내가 현재 NavMesh에서 어느 위치에 있지? " 라는 내부 상태를 항상 기억하고 있다.

 

transform.position만 바꾸면?

transform.position = pos 만으로 오브젝트의 시각적 위치는 바뀌지만, 

NavMeshAgent는 여전히 "내가 이전 위치에 있다"고 착각한다.

 

그래서 

* 이상한 방향으로 이동 시작하거나

* 목적지에 도착하지 못하고 헤매거나

* 순간적으로 예전 위치로 워프되기도 한다.

 

Warp은 뭐가 다르냐?

agent.Warp(newPosition);

 

이걸 쓰면

 - GameObject의 위치와

 - NavMeshAgent 내부의  "내가 여기 있어" 위치

 

이 둘이 동시에 업데이트된다.

즉, NavMeshAgent는 "지금 여기서부터 새로 경로 계산하자"하고 정확히 작동하게 된다.

 

ex ) GPS 네비게이션

 - transform.position만 바꾸는 것

    -> 네비게이션 화면만 끌어다 놓은것. 실제로 GPS 신호는 이전 위치 그대로

 - Warp()

   -> 진짜 GPS 위치도 업데이트된 것. 네비게이션이 "지금 여기구나!"라고 정확히 인식하는 상태

 

 

728x90