Collider / Collision

개발조하·2023년 11월 26일
0

Unity

목록 보기
9/30
post-thumbnail

1. 게임 내 물리력

1.1 Rigidbody

Unity에서 Object가 물리력을 활용하려면 Rigidbody 컴포넌트를 가져야 한다.
(2D의 경우 Rigidbody 2D 사용)
즉, Rigidbody는 GameObject가 물리 제어로 동작하게 하는 기능이다.

  • Mass : 질량 (kg)
  • Use Gravity : 중력 사용 여부
  • is Kinematic : 활성화되면 오브젝트는 물리 엔진으로 제어되지 않고 오로지 Transform으로만 조작됨
  • Constraints : 리지드바디의 움직임에 대한 제약사항 (충돌했을 때 Player가 오뚜기처럼 쓰러지지 않도록 제어하는 등의 기능)

1.2 Collider

Player가 Rigidbody로 중력을 갖게 되었다고 해도 스스로 Collider를 갖지 않거나, 마주치는 다른 Object가 Collider가 없다면 충돌이 발생하지 않고 Player만 하염없이 중력을 받아 밑으로 떨어지기만 한다.
그러므로, Player가 다른 물체와 상호작용하는 물리력을 갖추려면 Rigidbody와 함께 Collider를 가져야 한다.

❓ Object의 Mesh를 기준으로 충돌범위를 체크하지 않고 왜 굳이 Collider를 따로 생성해줘야 하나?
❌ Object, 특히 캐릭터의 경우 수많은 미세한 삼각형으로 Mesh가 이러어져 있다. 그 Mesh를 활용하여 충돌을 체크하게 되면 과한 연산이 필요하고 이는 심한 부하를 일으키게 된다.
💡 그러므로, Object 주변에 Collider 껍데기를 씌워서 충돌 연산을 할 수 있도록 하는 것이다.(게임 성향에 따라서 collider의 세밀함을 조절하면 좋다)

캐릭터가 Rigidbody와 Collider를 갖고 있다면 Collider를 가진 다른 물체와 만나 Collision(충돌)을 일으킬 수 있다!
ㄴ Plane에 Mesh Collider가 있기 때문에 Player를 공중에 띄운 상태에서 실행을 누르면 Plane을 만났을 때 더이상 밑으로 내려가지 않고, 바닥에 서있게 된다.
벽에 부딪히면 쓰러질 수 있다.

1.3 Rigidbody_is Kinematic의 쓰임

is Kinematic 체크 박스를 활성화하면 물리력을 받지 않겠다는 의미가 된다. 즉, 위에 Use Gravity를 체크했다고 하더라도 is Kinematic이 켜져있으면 중력도 받지 않는다.

❓ 그렇다면 Rigidbody 컴포넌트를 삭제하면 되지 굳이 컴포넌트를 추가하고 is Kinematic를 활성화시키는 이유는 뭘까?

💡 Rigidbody는 물리력를 적용하기 위한 컴포넌트이기도 하지만, Collision을 체크하기 위한 필수 컴포넌트이기도 하기 때문!!

2. 충돌 발생

2.1 OnCollisionEnter()의 조건

  • Player에 TestCollision.cs를 넣어주고,
public class TestCollision : MonoBehaviour
{
    private void OnCollisionEnter(Collision collision)
    {
        Debug.Log("Collision!");
    }

    private void OnTriggerEnter(Collider other)
    {
        Debug.Log("Trigger!");
    }
}
  1. 충돌하는 물체 중 하나에 Rigidbody가 있어야 한다 (둘 중 하나는 is Kinematic : Off)
  2. 나한테 Collider가 있어야 한다 (is Trigger : Off)
  3. 상대한테 Collider가 있어야 한다 (is Trigger : Off)
    ㄴ 3가지 조건이 부합한다면 Collision 이벤트가 실행되는 것을 볼 수 있다.

Colliders에 대한 공식문서를 살펴보면,
ㄴ 내가 Rigidbody와 Collider를 갖고 있으며 is Kinematic: On이라도, 상대방이 Rigidbody와 Collider를 갖고 is Kinematic: Off라면 충돌이 일어난다는 것을 알 수 있다.

2.2 Collision

Unity에서 제공하는 Collision에 대한 공식 문서를 살펴보자.

    private void OnCollisionEnter(Collision collision)
    {
        Debug.Log($"Collision @{collision.gameObject.name}!");
    }

ㄴ 나와 부딪힌 object를 Collision 변수에 담는다는 것을 알 수 있다.

2.3 OnTriggerEnter()의 조건

  • 둘 다 Collider가 있어야 한다.
  • 둘 중 하나라도 Rigidbody를 갖고 있어야 한다.
  • 둘 중 하나라도 is Trigger: ON 이어야 한다.

2.4 Trigger의 쓰임

Collision은 물리 연산이 많이 필요하다. 충돌했을 때의 두 물체 간의 물리적 리액션들이 필요하기 때문이다. 특히, Collsion되는 물체의 Collider에 Physic Material이 있을 경우에는 물리 연산이 더 필요하며 이러한 연산이 많이질 경우 부하가 생겨 퍼포먼스에 영향을 준다.

RPG 게임처럼 굳이 충돌 물리 액션이 필요하지 않고 공격 및 방어 등의 기능 구현을 위해 Trigger로 물체 간 접촉만 인지시키는 방법을 사용하면 좋다!

    private void OnTriggerEnter(Collider other)
    {
        Debug.Log($"Trigger @{other.gameObject.name}!");
        // HP -= 100; (체력 감소)
        // Coin += 100; (코인 획득)
        // Point += 100; (아이템 점수 획득)
        // ...
    }

📄 참고자료
[인프런] c#과 유니티로 만드는 MMORPG 게임 개발 시리즈_Collider / Collision
Rigidbody
Collision
Colliders_Collision/Trigger

profile
Unity 개발자 취준생의 개발로그, Slow and steady wins the race !

0개의 댓글