(유니티3D)OnCollisionEnter/Stay/Exit 사용시 주의점
어제부터 정말 이해가 안 가는 상황이 발생해서 진행도 안되고 짜증만 나서 주말이니 좀 놀아야겠다 싶어 놀다가 문득 들어 해결한 사건입니다.
이 게임은 유니티의 물리엔진을 적극 활용하는 게임입니다.
Rigidbody를 잔뜩 써서 모두 중력을 지니고 콜라이더를 지니고 있으며 충돌 판정을 검사합니다.
그렇기 때문에 OnCollisionEnter나 OnTriggerEnter 함수가 자연스레 따라옵니다.
여기서 OnCollision 함수는 양쪽 다 isTrigger가 켜져 있지 않을 때 콜라이더끼리 충돌하면 반응하는 함수입니다.
인자로는 함수 이름답게 Collision을 사용하지요.
OnTrigger 의 경우는 한 쪽 이상이 isTrigger가 켜져 있을 때 반응하며 인자로는 Collider를 사용합니다.
보통은 충돌 이후 코드 제어를 하기 전에 부딪친 대상에 대해 검사를 하고 그에 따른 제어를 해줍니다.
이 게임의 경우 땅에 닿았다면 코인을 뱉으며 깨지고 플레이어가 닿으면 그냥 깨지기만 합니다.
그리고 코드로는 대체로 태그로 구별합니다.
if(col.CompareTag()){} 의 형태로 말이죠.
Collision 경우 위와 같은 방법을 쓰려면 한번 경유해 줄 필요가 있습니다.
col.Collider.CompareTag() 이런 식으로 말이죠
근데 저는 별 생각 없이 col.gameObject.CompareTag() 를 사용했습니다.
사실 상관은 없습니다. 필요한건 태그 비교고 콜라이더를 거치든 게임오브젝트를 거치든 제가 알기론 별 차이는 없는 것으로 알고 있거든요.
근데 여기서 문제가 발생했습니다.
이 게임에 계속 변화를 주고 있는데 친구가 고드름이 몸통에 맞고 죽는건 좀 아닌거 같다길래 별도의 히트박스를 만들었습니다.
기존엔 몸 전체에 씌워져있는 콜라이더 하나가 끝이었는데 머리만 히트 판정을 가져야 하기에 자식으로 콜라이더만 하나 만들었습니다.
기존 콜라이더는 땅밟기를 위해 냅두고 히트박스에 태그만 바꿔 달았습니다.
그리고 OnCollision 함수는 자신이 가진 콜라이더에 대해서만 반응합니다. 그렇기에 히트 박스 전용의 스크립트를 따로 생성하고 히트 관련된 상호작용 코드 또한 조정해 줍니다.
그리고 실행하면 잘 되야 하는데...
아무리 해도, 몇번을 시도해도, 껏다 켜도 고드름이 히트 박스의 태그를 인식하지 못 합니다.
문제를 못 발견할 수가 없을 정도로 간단한 코드인데 문제가 발생한 것입니다.
문제가 생기면 바로바로 Debug.Log로 이것저것 파악을 했어야 했는데 너무 당황한 나머지 몇 시간동안 삽질하다 하루를 거의 통째로 날렸는데...
혹시나 부모를 가져오나 싶어서 로그를 찍어보니 정말 부모 오브젝트가 찍혔습니다.
??? 도대체 왜?
솔직히 이건 아직도 왜 그런지 모르겠습니다만 col.Collider.CompareTag()로 바꾸니 정상적으로 자신을 찍었습니다.
정말 생각치도 못 한 부분에서 문제가 발생했고 이유도 굉장히 혼란스럽네요.
Hierarchy에선 맨 위와같이 배치하고 스크립트에서 OnCollisionEnter2D(Collision2D col) 함수에서 로그를 찍게 해봤습니다.
그러자 맨 아래와 같은 로그가 찍혔습니다.
혹시 지금까지 몰랐지만 .gameObject는 부모의 오브젝트를 따오는건 아닐까 싶어 플레이어 캐릭터를 더미 오브젝트 자식으로 넣고 .gameObject.gameObject 를 한 뒤 로그를 찍어봤지만 더미가 찍히지 않고 Player 오브젝트가 찍혔습니다. 즉, 부모를 뽑아오는 것은 아니란건데...
아무튼 처음 겪었지만 이런 기능이 잠재되어 있다는 것을 알았기에 이것저것 실험해볼 생각입니다.
이게 2D에만 생기는 증상은 아닌지, 혹시 유니티가 노린 잠재 기능이라면 어디까지 먹히는지 등 실험해 보고 오겠습니다.
'Icicle Game (2D) > 발전' 카테고리의 다른 글
1.02버전 업데이트 (0) | 2017.12.11 |
---|---|
패치 예정 (0) | 2017.12.11 |
(유니티3D)비동기 씬 로딩에 대해3 (0) | 2017.12.09 |
(유니티3D)비동기 씬 로딩에 대해2 (0) | 2017.12.08 |
(유니티3D)비동기 씬 로딩에 대해 (0) | 2017.12.08 |