Unity 2017 - Composite Collider 를 사용하며 생긴 일들

2018. 10. 13. 14:19개발/게임 개발


여러 플랫폼의 컬라이더가 겹치면서 여러가지 문제가 발생했다.


애니메이션이 꼬이는 문제와, 컬라이더가 겹치는 부분에서 걸리는 문제가 발생하였다.


이를 해결하기 위해 Composite Collider를 사용하였다.


원래는 아래와 같이 컬라이더 간에 겹치는 부분이 있어서, 겹치는 부분을 지날 때에 잠깐 점프하는 애니메이션이 나오는 문제가 생겼다.





이를 Composite Collider를 사용하여 아래와 같이 바꾸었다. 그 후로 컬라이더가 겹치는 부분에서 애니메이션이 버벅이는 문제가 발생하진 않았다.







Composite Collider 컴포넌트를 Object에 추가하면 Rigidbody와 Composite Collider 컴포넌트가 동시에 추가된다.



여기서 중요하게 보아야 할 것은 

Geometry Type 과 Generation Type이다. 


먼저 Geometry Type은 Outlines와 Polygons가 있다. 


Outlines을 선택할 시에는 Edge Radius 값을 설정해주어야 한다. Edge Radius는 위의 Composite Collider 사진처럼, 컬라이더의 꼭지점이 되는 부분을 원으로 하여 두 컬라이더 간의 이음새를 부드럽게 이어줄 수 있다.


Polygons는 Polygon Collider 처럼 생긴 collider가 만들어진다. Composite Collider 를 구성하는 각 collider들의 모양을 그대로 가져온다.


다음은 Generation Type이다. 이 항목은, Synchronous와 Manual 두 가지 값 중 선택할 수 있다.


Synchronous의 경우 컬라이더가 사용 될 때마다, 재 생성을 요청한다.


Manual의 경우 Inspector 의 Composite Collider 내에 "Regenerate Collider" 버튼을 누를 때에, 그리고 " CompositeCollider2D.GenerateGeometry" API를 스크립트 상에서 호출할 때에 컬라이더를 재생성한다.


나의 경우 런타임에 Composite Collider를 사용하는 오브젝트의 내부 컬라이더들의 배치가 바뀌는 상황이 없어서, "Manual"을 사용하였다.




Composite Collider를 적용하여서 예상치 못한 문제가 생겼었다.


원래는 여러개의 컬라이더로 플랫폼이 구성되어 있었고, 캐릭터가 밟는 Ground 역할을 하던 컬라이더가 명확했다. 


하지만, Composite Collider를 사용하면서, Ground와 캐릭터가 밟는게 아닌 Wall이 같은 컬라이더로 취급되면서, "OnCollisionExit2D" 메서드가 호출되는 시점이 의도와 다르게 바뀌었다.


Composite Collider는 한 개의 collider로 취급되기 때문에, Wall과 Collision이 있는 상태에서, Ground에서 점프하면, Wall과 Ground는 같은 collider이기 때문에, "OnCollisionExit2D" 메서드가 호출되지 않는다. 


이는 기존에 OnCollision~ 에서 Collision의 Contact, 즉 접점의 상대좌표로써 캐릭터의 현재 state를 판단하던 로직의 문제였기에, state 판단 기준을 RayCast로 바꾸어서 해결할 수 있었다.


요점은, Composite Collider를 사용하면, 여러 컬라이더가 1개의 컬라이더로 바뀌기에, Collision이나 Trigger의 갯수 기반으로 작동하는 기능이 있다면 의도와 다르게 작동할 수 있다는 것이다.



'개발 > 게임 개발' 카테고리의 다른 글

Unity 2017 - 로딩 씬 연출  (0) 2018.07.09