게임에서 충돌은 정말 중요하고 많이 사용된다. 캐릭터가 활을 쏘거나 총을 쏠 때 화살, 총알의 충돌이나 캐릭터간의 충돌로 인해 이동에 방해를 받는 상황과 같이 실제 충돌은 많이 쓰이게 된다.
어떤 운동하고 있는 물체가 다른 물체와 부딪히는것 외에도 물체가 땅위에 서 있거나 유저가 무엇을 클릭하는 것도 하나의 충돌이라고 할 수 있다.
Unity에서 물리를 적용하기 위해서 특정 Component를 추가해줘야 하는데 그것이 바로 RigidBody
라는 Component이다. RigidBody를 사용하면 질량, 중력 여부와 같은 실제 물리엔진에서 사용하는 상수들을 설정할 수 있다.
캐릭터에 중력은 작용하지만 땅을 뚫고 내려간다. 물리요소만 적용되었지 충돌이 발생하지 않는다.
물리적 요소를 적용하기 위해서 RigidBody Component를 사용한다면, 충돌을 적용하기 위해서는 Collider Component를 적용한다. Collider에는 Box Collider
, Sphere Collider
, Capsule Collider
, Mesh Collider
등 많은 종류가 있는데 적용할 Object의 형태와 크기에 따라 맞는 Collider를 사용하면 된다.
캐릭터 모델 자체에 충돌판정을 적용하는 것은 캐릭터 모델은 수십 수백개의 도형들로 이루어져 있기 때문에 굉장히 많은 연산을 필요로 할 것이다. 거기다가 충돌판정을 내릴 Object는 캐릭터 뿐만 아니라 몬스터나 NPC와 같은 다른 Object에도 적용해야한다.
캐릭터에는
RigidBody
와Collider
가, 바닥에는Collider
가 적용된 상태이다.
위 과정에서 캐릭터는 바닥에 서있게 되는데 이 상태에서 다른 물체를 둬서 캐릭터와 물체를 충돌시켜보자.
캐릭터가 충돌 후 뒤로 넘어지게 되는데, 넘어지는 이유는 캐릭터가 물리 영향
을 받기 때문이다. 다시말해 부딪힐 때 가상의 힘을 받아 넘어지게 되는 것이다.
RigidBody
옵션 중 isKinematic
이라는 옵션이 있는데 물리 영향을 키고 끌 수 있는 옵션이다. 하지만 isKinematic
를 켜버리게 되면 물리 영향 중 하나인 중력
이 적용되지 않는다.
중력영향을 받기 위해서 RigidBody
했는데 isKinematic
을 키면 중력영향을 받지 않는 모순적인 상황이 발생한다.
RigidBody
는 물리요소를 적용하기 위해서 사용하는 것이 아니라 다른 사용목적이 존재한다.
충돌 이벤트를 처리하는 방법은 2가지가 있다.
OnCollisionEnter의 호출 조건은 다음과 같다.
1. 자신의 GameObject에는 Rigidbody가 있어야 한다.
2. 자신의 GameObject와 상대방의 GameObject에 Collider가 있어야 한다.
3. 두 Collider의 'IsTrigger' 옵션은 비활성화상태이어야한다.
OnTriggerEnter 호출 조건은 다음과 같다.
1. 두 GameObject 중 적어도 하나에는 Rigidbody가 있어야 한다.
2. 자신의 GameObject와 상대방의 GameObject에 Collider가 있어야 한다.
3. 두 Collider 중 적어도 하나에는 'IsTrigger' 옵션이 켜져있어야 한다.
OnCollisionEnter
은 총을 맞은 처리와 같은충돌이벤트
를 처리한다면,
OnTriggerEnter
는 범위안의탐지이벤트
를 처리하고자 할 때 사용한다.