유니티 메쉬 콜라이더 convex - yuniti meswi kollaideo convex

Asked 3 years, 4 months ago

Viewed 362 times

I want to use a flat 3d circle in my game. I need circle collider in 3D, but it doesn't exist in unity. I created circle with 500 vertices and added mesh collider. If I don't check convex it looks correct. With convex it changes to box collider. How can I make a circle collider?

asked Jul 24, 2019 at 10:45

유니티 메쉬 콜라이더 convex - yuniti meswi kollaideo convex

You can create a Cylinder in a 3D modeling program like Blender with a very small height.

유니티 메쉬 콜라이더 convex - yuniti meswi kollaideo convex

Export it as a FBX to Unity and then apply a mesh collider to it, next hide the object by removing the Mesh Renderer making it invisible leaving only the collider.

유니티 메쉬 콜라이더 convex - yuniti meswi kollaideo convex

answered Jul 24, 2019 at 11:01

유니티 메쉬 콜라이더 convex - yuniti meswi kollaideo convex

akaBaseakaBase

2,1231 gold badge17 silver badges31 bronze badges

3

Collider 컴포넌트

- Box Collider: 가장 다양한 용도로 사용된다

- Sphere Collider: Collider 중 처리속도가 가장 빠르기에 정밀한 충돌 감지가 필요한 경우를 제외하고는 일반적으로 Sphere를 사용한다

- Capsule Collider: 주로 인체, 나무, 가로등 같은 모델의 충돌체로 사용한다

- Mesh Collider: Collider 중 부하가 가장 높으며 정밀한 충돌 감지가 가능하다. 속도 저하를 방지하기 위해 Mesh Collider간 충돌 감지가 안 되도록 기본으로 설정되어

있으며 필요시 Convex 옵션 체크해야 한다

- Wheel Collider: 차량 바퀴에 사용하는 Collider. 특정 좌표축으로의 회전을 제한한다. ex) 기본적으로 X축으로만 회전하고 Y축의 회전은 물리엔진이 아니라 rotation

값에 의해 조절하며 Z축으로는 회전하지 않는다. 차량 모델의 경우 타이어와 차체가 분리되어 있는데 이는 각각 다른 Collider를 적용해야 하기 떄문이다

- Terrain Collider: 유니티에 내장된 Terrain Engine을 이용해 생성한 지형에 적용하는 Collider. 지형의 복잡도에 따라 Collider의 부하가 높아진다. low poly mesh를

이용해 Mesh Collider로 대체 가능하다. Terrain Collider는 모든 메쉬데이터에서 충돌감지 계산이 수행되기에 비용이 매우 커서 최근까지도 모바일에는 잘 안 쓰였다

- 연산 처리속도(폴리곤 개수): Sphere(8) > Capsule(10) > Box(12) *단, Quad에 Mesh Collider를 적용하면 폴리곤 2개이므로 Collider 중 속도가 가장 빠르다

- Collider 생성할 때 적용되는 폴리곤 방식은 게임오브젝트 생성할 때와는 다르다

- 게임 스테이지 전체를 low poly mesh로 만들고 Mesh Collider 적용 및 Mesh Renderer는 제거하여 게임 스테이지에 오버랩 하면 미로 같은 스테이지에서 플레이어가

스테이지 밖으로 벗어나지 못하게 할 수 있다

- 오브젝트에 따른 Collider를 정할 때는 오브젝트의 형태가 아니라 용도를 고려해야 한다. 총알의 경우 Sphere Collider, 사람의 경우 Capsule Collider가 적합하다

- 캐릭터는 Translate로 이동하는데 벽과 벽이 만나는 모서리로 돌진했을 때 다음번 이동좌표가 벽의 안쪽이면 튕겨나오고 들어가고를 반복하면 깜빡이거나 벽 밖으로 튕겨나갈 수 있다. 이 때 벽 자체를 늘리면 프리팹이기에 양 쪽 벽이 모두 늘어나서 겹치는 부분이 생기므로(중첩된 텍스처는 깜빡인다) 벽의 Collider만 늘려줘서 벽 밖으로 튕겨나가는 것을 방지한다

- 움직이는 Collider는 매 프레임 그려지는 것이기에 Collider와 Collider의 충돌은 일단 겹쳐지게 그려진 후에 Rigidbody가 있는 객체가 밀려나는 방식으로 구현된다. 만약 벽에 Rigidbody를 달아주면 피격시 벽이 밀려나거나 뒤로 넘어간다

Collision detection occurs and messages are sent upon collision

Static Collider

Rigidbody Collider

Kinematic Rigidbody Collider

Static Trigger Collider

Rigidbody Trigger Collider

Kinematic Rigidbody Trigger Collider

Static Collider

Y

Rigidbody Collider

Y

Y

Y

Kinematic Rigidbody Collider

Y

Static Trigger Collider

Rigidbody Trigger Collider

Kinematic Rigidbody Trigger Collider

Trigger messages are sent upon collision

Static Collider

Rigidbody Collider

Kinematic Rigidbody Collider

Static Trigger Collider

Rigidbody Trigger Collider

Kinematic Rigidbody Trigger Collider

Static Collider

Y

Y

Rigidbody Collider

Y

Y

Y

Kinematic Rigidbody Collider

Y

Y

Y

Static Trigger Collider

Y

Y

Y

Y

Rigidbody Trigger Collider

Y

Y

Y

Y

Y

Y

Kinematic Rigidbody Trigger Collider

Y

Y

Y

Y

Y

Y

충돌 이벤트(Collision, Trigger)

- Collider 컴포넌트를 포함한 게임오브젝트 간 충돌이 발생하면 OnCollision- 또는 OnTrigger- 메서드가 호출된다

두 물체 간 충돌이 일어나기 시작했을 때: void OnCollisionEnter / void OnTriggerEnter

두 물체 간 충돌이 지속될 때: void OnCollisionStay / void OnTriggerStay

두 물체가 서로 떨어졌을 때: void OnCollisionExit / void OnTriggerExit

- 충돌 이벤트 발생 조건

Collision 이벤트

조건1: 충돌하는 두 게임오브젝트에 모두 Collider 컴포넌트가 있고, 둘 다 'Is Trigger'가 체크되어 있지 않아야 한다

조건2: 두 게임오브젝트 중 적어도 한 쪽에는 non-kinematic Rigidbody 컴포넌트가 있어야 한다

Trigger 이벤트

조건1: 충돌하는 두 게임오브젝트에 모두 Collider 컴포넌트가 있고, 적어도 한 쪽에는 'Is Trigger'가 체크되어 있어야 한다

조건2: 두 게임오브젝트 중 적어도 한 쪽에는 Rigidbody 컴포넌트가 있어야 한다('Is Kinematic' 체크여부는 상관없다)

- 충돌 이벤트가 발생했을 때 Tag를 이용해 충돌체를 식별한다

- 모든 Collider 컴포넌트에는 Is Trigger 속성이 있다. 체크하면 충돌을 감지하기는 하지만 물리적인 충돌은 일어나지 않기에 다른 물체가 관통하게 된다

- Collider만 있어도 충돌은 일어나지만 여기에 Rigidbody를 추가하면 충돌을 감지하고 충돌 정보에 접근할 수 있다(물론 Rigidbody의 기능은 이외에도 더 많다)

- 충돌하는 두 오브젝트 중 하나라도 trigger collider인 경우 Trigger 이벤트 발생하고 둘 다 non-trigger collider여야만 Collision 이벤트 발생

- 충돌 이벤트(Collision, Trigger) 발생시 충돌한 게임오브젝트에 포함된 모든 스크립트에서, 즉 충돌 주체와 객체의 모든 스크립트에서 OnCollsion- 메서드를 호출한다

- OnCollision-, OnTrigger-와 같은 Callback 메서드는 대소문자나 오탈자가 있더라도 오류가 발생하지 않고 해당 이벤트가 없는 것으로 판단해서 메서드 내 로직이 실행되지 않으므로 이름을 정확하게 입력해야 한다

OnCollision- 메서드

- 충돌 정보가 담긴 Collision을 인수로 전달받으며, 인수가 필요없으면 매개변수 선언을 생략할 수 있다

collider: 이 메서드가 정의된 스크립트가 담겨있는 게임오브젝트를 기준으로 자신에게 충돌한 게임오브젝트의 Collider를 가리킨다

contacts: 물리엔진에 의해 생성되는 충돌지점. 두 물체가 충돌할 때 접점은 여러 개일 수 있기에 ContactPoint 구조체 타입의 배열을 반환한다

ContactPoint 구조체

normal: 충돌지점의 법선벡터. 이 메서드가 포함된 게임오브젝트를 기준으로 자기자신을 향하는 법선이다(충돌체를 향하는 법선이 아님에 주의)

otherCollider: 충돌지점의 다른 Collider

point: 충돌지점의 위치

separation: 충돌한 두 Collider 간의 거리

thisCollider: 충돌지점의 첫 번째 Collider

gameObject: 충돌한 게임오브젝트

impulse: 충돌시 발생한 충격량

relativeVelocity: 충돌한 두 물체의 상대적인 선 속도(읽기전용)

rigidbody: 충돌한 게임오브젝트의 Rigidbody 컴포넌트(읽기전용)

transform: 충돌한 게임오브젝트의 Transform 컴포넌트(읽기전용)

OnTrigger- 메서드

- 자신에게 충돌한 게임오브젝트의 Collider를 인수로 전달받으며, 인수가 필요없으면 매개변수 선언을 생략할 수 있다

유니티 메쉬 콜라이더 convex - yuniti meswi kollaideo convex

Layer Collision Matrix

레이어 기반 충돌감지

- 충돌감지는 레이어 별로 지정할 수 있다. ex) 위 그림에서는 Layer1, Layer2, Layer3가 각각 동일한 레이어에서만 충돌을 감지하도록 체크했다

- [Edit]-[Project Settings]-[Physics]에서 설정

[개념정리]

*Convex(볼록한, ↔ Concave)

- Mesh Collider 컴포넌트에 포함된 속성이며, 체크하면 연결된 Mesh 형태를 참조하되 닫힌 형태(= convex)의 collider를 생성한다. 이 때, 연결된 Mesh에 사용된

polygon(삼각형)의 개수에 상관없이 최대 255개의 polygon을 사용해서 Collider를 생성한다. 체크를 안 하면 Mesh와 동일한 형태의 collider를 생성한다

- convex의 수학적 의미는 공간 내 임의의 두 점을 선택했을 때 두 점을 이은 선은 반드시 해당 공간에 포함된다는 성질을 의미한다

- 마찬가지로 Non-convex(= concave)의 의미는 공간 내 임의의 두 점을 이은 선이 공간을 벗어날 수도 있음을 의미한다

유니티 메쉬 콜라이더 convex - yuniti meswi kollaideo convex

convex(좌), concave(우) / 출처: '이득우 게임과 여행' 블로그

- 유니티 5.0 버전부터 'Non-convex Mesh Collider with non-kinematic Rigid Bodies' 는 지원되지 않는다. 즉, Convex 체크가 안 된 Mesh Collider 컴포넌트와

Rigidbody 컴포넌트를 하나의 게임오브젝트에 적용하려면 Rigidbody의 Is Kinematic을 체크해야 한다(= Convex 체크가 안 된 Mesh Collider는 충돌체크는 가능하

지만 물리엔진의 영향을 받을 수는 없다). 반대로 Convex 체크된 Mesh Collider에 Rigidbody를 함께 적용하면 충돌감지도 하면서 물리엔진의 영향도 받을 수 있다

- non-convex(= concave) mesh를 가진 물체에 Non-convex Collider를 적용하는 방법: 수많은 Box Collider를 겹쳐서 물체 형태로 만들기

- Convex 기능은 다른 Mesh Collider를 가진 게임오브젝트와 충돌감지를 하려면 체크해야 하며, collider를 단순한 형태로 만들어 부하를 줄이려는 목적으로도 사용한다

(Convex를 체크하면 Mesh와 거의 유사한 형태를 갖되 최대 255개의 폴리곤만 이용해서 collider를 생성하기 때문)

- 물리엔진은 물체의 부피값을 필요로하므로 Convex 체크된 Mesh Collider가 Quad 또는 Plane인 경우 물리엔진에 의해 일정수준의 부피값을 갖게 된다

<참고자료>

- 이재현, <절대강좌! 유니티>, 2018

- http://blog.dustinlee.me/221410094589

- https://docs.unity3d.com/Manual/CollidersOverview.html

- https://docs.unity3d.com/Manual/CollidersOverview.html

- https://docs.unity3d.com/ScriptReference/ContactPoint.html