본문 바로가기

유니티 스파르타 캠프 4주차

2025-05-01 유니티 Collision과 Trigger의 관계

ㅋㅋ 처음 물어볼 땐

반응을 하지 않는다길래 잘못 알고 있다가 나중에야 잘못된 정보임을 알았습니다.Collision과 Trigger는 서로 물리적인 작용은 없지만, Trigger의 경우 Collision이 Trigger의 영역에 들어오면 TriggerEnter라고 하여 들어왔을 때, 실행되는 기능을 사용할 수 있습니다. 추가로 그것을 알기 전에는 Physics2D.RayCast라고 부르는 기능을 활용하여 일정 범위 내에 있는 존재를 인식했었습니다.

그럼 저는 무엇을 만들려고 했는지부터 말씀드리자면,
플레이어가 문여는 장치에 접근 -> 장치가 활성화되며, 사용 방법 설명 -> 장치를 사용 시 문이 열림. 구조였습니다.

참 간단하고 별 내용이 없죠? 하지만 RayCast를 쓰면 좀 더 복잡해지고, 코드도 재사용이 많이 되는 느낌이었습니다. 

솔직히 크게 다른 점은 없지만, 계산해야되는 부분이 많아지고 direction의 방향을 정하는 원리나 LayerMask라는 낯선 클래스명을 접하면서 조금 힘겨웠습니다. 2비트 연산자도 처음 써보게 되었는데 2비트 연산자의 경우, 속도 측면에서 굉장히 유리하기 때문에 언젠가는 써야된다고 합니다. (일단 저는 저 위에 Trigger로 해결했습니다. 계속 수정해야하는데 제가 감당이 안될 거 같아서)

Debug.Log(check.collider.gameObject.tag);
Gizmos.DrawLine(origin, target.position);

위에 녀석은 check.collider, 즉 RayCast의 접촉중인 게임오브젝트의 태그를 구하는 코드이고, 밑에 내용은 Gizmos.DrawLine이라고 하여 (시작위치, 도착위치)를 입력하면 그 둘을 선으로 이어주는 코드입니다. 그래서 비슷한 연산자를 사용하고 실제로 눈에 보이지 않는 것이 불편한 작업의 경우, RayCast로 거리를 보여주기에 사용하기 좋았습니다. 

또한 문제가 하나 더 있었습니다. 내용을 보시게 되면 제가 굳이 LayerMask를 써야할까? 생각이 들 수 있습니다. 낯선 내용이고 익숙한 CompareTag가 더 간편한 거 같은데 복잡하기만 한거 쓰기 싫다. 하지만 RayCast는 LayerMask로 예외처리를 할 수 있도록 되어있고 예외처리를 하지 않는다면 본인 오브젝트도 감지하기 때문에 예외처리가 거의 필수였습니다. 대신에 좋은 점이라고 한다면 여러 레이어를 감지할 수가 있어서 이를 이용하면 TriggerEnter보다 적은 내용으로 오브젝트에 대한 판별을 할 수 있을 거 같습니다.