게임을 구현하는데 Collider를 사용하는 경우가 있다. 그리고 이런 Collider를 통해서 서로 다른 객체가 충돌하였는지 확인할 수 있다.
이에 대해서, 내가 겪었던 문제에 대해서 풀어보려 한다.
충돌했는가?
우선 아래 예시의 결과를 보여주겠다.
"OnTriggerEnter2D 이벤트가 발생하지 않는다."
결과를 확인하였다면, 아래의 예시가 어떻게 위와 같은 결과가 나오는지 생각해보도록 하자.
객체들은 정사각형에 크기가 (10, 10)으로 고정되어 있다.
객체 A : BoxCollider2D와 Rigidbody를 가지며, Trigger가 활성화 되어있다.
객체 B : BoxCollider2D를 가진다.
객체 A는 (0, 0)에 위치해있고, 비활성화 되어있다.
객체 B는 (0, 0)에 위치해있고, 활성화 되어있다.
->
객체 A가 활성화 되었다.
위의 예시 상황이 내가 겪었던 문제이다.
충돌 검사
충돌 검사에서 가장 중요한 것이 있다. 바로 ‘어느 시점에 충돌 검사를 하는가?’이다.
엔진의 특성상 개발에서 성능의 낭비가 생기지 않도록, 최적화를 해주어야한다. 그 말은 즉, 매 순간마다 충돌 검사를 할 수 없다는 것이다.
그렇기에 유니티는 객체의 Collider, Rigidbody, Position의 변화마다 충돌 검사를 한다.
"구현한 객체는 게임이 진행됨에 따라서, 위치와 상태가 변할 수 있다."
"객체의 위치와 상태에 따라서 Collider의 상태도 바뀔 수 있다."
이것을 위의 예시와 다시 확인해보면, 아래와 같다.
"Collider가 활성화 되었지만, 충돌 검사가 진행되지 않아서 충돌하지 않은 것과 같다."
해결 과정
첫번째 시도
해결을 위해서 구글링을 하던 도중에 ‘물리 연산 동기화’를 해주는 함수를 찾아서 사용해 보았다.
Physics.SyncTransforms();
결과 : 에디터 Play 이후에 단 한번만, OnTriggerEnter2D 이벤트가 발생하였다. 그 이후에는 이벤트가 발생하지 않았다.
비활성화된 객체에 대한 동기화를 한번 진행하였기 때문에, transform의 변화가 없다면 더이상 동기화 되지 않았다.
두번째 시도 - 해결
객체의 위치가 변경될 때마다, 충돌 검사를 한다는 점을 이용하여서 해결하였다.
transform.position += new Vector2(0.00001f, 0);
매우 미세하게 객체를 움직인 것을 통하여서, 충돌 검사가 진행되도록 하였다.
이 글은 저의 경험을 바탕으로 작성된 글입니다.
'유니티 > 겪었던 문제' 카테고리의 다른 글
| 에디터/빌드 환경에서 Instance의 차이 (0) | 2025.06.25 |
|---|---|
| ScriptableObject를 사용하며 겪었던 문제 (0) | 2025.04.24 |
| New Input System에서 겪었던 문제들 (0) | 2024.11.26 |