일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- 알고리즘
- 전쟁-전투
- kraftonjungle
- c#
- 백준
- 다익스트라
- KRAFTON JUNGLE
- 알고리즘수업-너비우선탐색2
- project3
- 연결리스트
- 파이썬
- 크래프톤정글
- 티스토리챌린지
- 크래프톤 정글 4기
- Unity
- BFS
- 추상클래스와인터페이스
- 4기
- pintos
- 이벤트 함수 실행 순서
- anonymous page
- 네트워크
- 크래프톤정글4기
- 크래프톤 정글
- User Stack
- 유니티
- 핀토스
- 오블완
- C
- TiL
- Today
- Total
말감로그
[Unity] NavMeshAgent Wrap 본문
드라이브스루 시스템 구현 중 차를 스폰하는 과정에서 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 위치도 업데이트된 것. 네비게이션이 "지금 여기구나!"라고 정확히 인식하는 상태
'Unity' 카테고리의 다른 글
[Unity] 리소스 폴더 , 에셋 번들 , 어드레서블 알아보기 (1) | 2025.08.08 |
---|---|
[Unity] UI 위에 게임 오브젝트 띄우기 (0) | 2025.05.17 |
[Unity] Cinemachine Collider (0) | 2025.05.01 |
네트워크 동기화 (0) | 2025.02.22 |
[Unity] 디자인 패턴 - 오브젝트 풀링 (0) | 2025.02.20 |