[Unity] Collision

이정석·2023년 6월 25일
0

Unity

목록 보기
4/22

Collision

게임에서 충돌은 정말 중요하고 많이 사용된다. 캐릭터가 활을 쏘거나 총을 쏠 때 화살, 총알의 충돌이나 캐릭터간의 충돌로 인해 이동에 방해를 받는 상황과 같이 실제 충돌은 많이 쓰이게 된다.

어떤 운동하고 있는 물체가 다른 물체와 부딪히는것 외에도 물체가 땅위에 서 있거나 유저가 무엇을 클릭하는 것도 하나의 충돌이라고 할 수 있다.


Collider

1. RigidBody

Unity에서 물리를 적용하기 위해서 특정 Component를 추가해줘야 하는데 그것이 바로 RigidBody라는 Component이다. RigidBody를 사용하면 질량, 중력 여부와 같은 실제 물리엔진에서 사용하는 상수들을 설정할 수 있다.
Collision01

캐릭터에 중력은 작용하지만 땅을 뚫고 내려간다. 물리요소만 적용되었지 충돌이 발생하지 않는다.

2. Collider

물리적 요소를 적용하기 위해서 RigidBody Component를 사용한다면, 충돌을 적용하기 위해서는 Collider Component를 적용한다. Collider에는 Box Collider, Sphere Collider, Capsule Collider, Mesh Collider 등 많은 종류가 있는데 적용할 Object의 형태와 크기에 따라 맞는 Collider를 사용하면 된다.

캐릭터 모델 자체에 충돌판정을 적용하는 것은 캐릭터 모델은 수십 수백개의 도형들로 이루어져 있기 때문에 굉장히 많은 연산을 필요로 할 것이다. 거기다가 충돌판정을 내릴 Object는 캐릭터 뿐만 아니라 몬스터나 NPC와 같은 다른 Object에도 적용해야한다.

  • 모델에 충돌 범위를 담당하는 Collider를 적용해 충돌 판정을 보다 쉽게 한다.
  • 충돌 범위를 모델에 가깝게 하면 할수록 정확한 판정을 내릴 수 있지만 연산량이 증가한다.

Collision02

캐릭터에는 RigidBodyCollider가, 바닥에는 Collider가 적용된 상태이다.


Collision

위 과정에서 캐릭터는 바닥에 서있게 되는데 이 상태에서 다른 물체를 둬서 캐릭터와 물체를 충돌시켜보자.
Collision03
캐릭터가 충돌 후 뒤로 넘어지게 되는데, 넘어지는 이유는 캐릭터가 물리 영향을 받기 때문이다. 다시말해 부딪힐 때 가상의 힘을 받아 넘어지게 되는 것이다.

  • 물리학에서 '작용 반작용'과 비슷한 것 같다.

RigidBody옵션 중 isKinematic이라는 옵션이 있는데 물리 영향을 키고 끌 수 있는 옵션이다. 하지만 isKinematic를 켜버리게 되면 물리 영향 중 하나인 중력이 적용되지 않는다.

중력영향을 받기 위해서 RigidBody했는데 isKinematic을 키면 중력영향을 받지 않는 모순적인 상황이 발생한다.

RigidBody는 물리요소를 적용하기 위해서 사용하는 것이 아니라 다른 사용목적이 존재한다.

1. Collision Event

충돌 이벤트를 처리하는 방법은 2가지가 있다.

  • OnCollisionEnter(Collision collision)
    두 개의 Object가 물리적으로 충돌했을 때 호출되는 함수로 인수의 collision에는 상대 Object의 정보, 충돌 지점, 방향 등 충돌에 관한 정보를 가지고 있다.

OnCollisionEnter의 호출 조건은 다음과 같다.

1. 자신의 GameObject에는 Rigidbody가 있어야 한다.
2. 자신의 GameObject와 상대방의 GameObject에 Collider가 있어야 한다.
3. 두 Collider의 'IsTrigger' 옵션은 비활성화상태이어야한다.
  • OnTriggerEnter(Collider other)
    한 Object의 Collider가 다른 Object의 Collider 영역에 진입했을 때 호출되는 함수로 인수의 other에는 영역에 진입한 Object의 정보를 얻을 수 있다.

OnTriggerEnter 호출 조건은 다음과 같다.

1. 두 GameObject 중 적어도 하나에는 Rigidbody가 있어야 한다.
2. 자신의 GameObject와 상대방의 GameObject에 Collider가 있어야 한다.
3. 두 Collider 중 적어도 하나에는 'IsTrigger' 옵션이 켜져있어야 한다.

OnCollisionEnter은 총을 맞은 처리와 같은 충돌이벤트를 처리한다면,
OnTriggerEnter는 범위안의 탐지이벤트를 처리하고자 할 때 사용한다.

profile
게임 개발자가 되고 싶은 한 소?년

0개의 댓글