본문 바로가기

유니티 기초/개념

[Unity 개념] 4. 충돌 적용에 대하여

※참고사항※
해당 포스트는 본업 개발자가 정성껏 포스팅한 포스트가 아닙니다!
평범한 고등학생이 유니티를 배우면서 적어나가는 포스트라는 점을 이해해 주십사 하고 청하는 바입니다.
(잘못된 정보는 댓글로 감사히 받겠습니다!)

목차

1. 충돌 적용
  1-1. 충돌 적용이 필요한 이유
  1-2. Collider란?
  1-3. Collider의 사용법

 

1. 충돌 적용

1-1. 충돌 적용이 필요한 이유

저번 포스팅에서 중력에 대해서 배웠었죠?

(아직 보지 못했다면 아래의 링크를 통해서 확인하실 수 있습니다!)

 

 

[Unity 개념] 3. 중력 적용에 대하여

저번 포스팅의 내용인 '중력'에 대한 설명이 있습니다!

rktrjtrit-unity.tistory.com/4

 

그럼 이번에는 예고했던 대로 충돌 적용에 대해서 공부할 것인데요.

"충돌 적용이 어째서 필요하냐?"

하시는 분들이 있을텐데요.

 

일단 아래의 영상을 보시면 이해하실겁니다.

 

영상을 보기 전에 사전 설명을 하겠습니다!

저번에 만들었던 프로젝트에서 플레이어와 중력, 플렛폼을 추가했습니다.

(작은 흰색 사각형이 "플레이어", 큰 초록색 사각형은 "바닥"이라고 생각해주시면 좋을 것 같습니다!)

(이제부터 흰색 사각형을 플레이어라고 부르도록 하겠습니다!)

 

저는 분명 "바닥"을 깔았는데도 불구하고 "바닥"에 플레이어가 안착하는 것이 아닌 아래로 뚫고 내려가 버립니다.

 

이 때 플레이어가 바닥에 안착할 수 있도록 해주는 것이 바로 "충돌"인 것입니다.

쉽게 설명하면 게임에 있는 히트박스같은 것을 생각하면 편하실 듯 합니다. 

(위의 설명들은 이해를 돕기 위한 쉬운 설명일 뿐 정확한 정의는 아닙니다!)

 

이제 충돌이 필요한 이유가 이해 되셨을 것이라고 믿고

충돌을 적용하는 방법으로 넘어가겠습니다.

 

1-2. Collider란?

충돌을 적용하는 방법에는 Collider 컴포넌트를 이용하는 방법이 있습니다.

충돌을 적용하기 전에 Collider에 대해 알아보겠습니다.

 

Collider는 Rigidbody와 같이 유니티에서 제공하는 물리 효과입니다.

 

 

Collider를 적용한 모습입니다!

(1, 1이 딱 맞아서 보이지 않은 탓에 2, 2로 크기를 늘린 사진입니다!)

< 초록색 선이 충돌 경계선입니다! >

 

 

일단 Collider에는 많은 종류가 있는데요.

하나하나 알아보도록 하겠습니다! (Box Collider 기준입니다!)

(설명되지 않은 것은 아직 단 1번도 사용하지 않아서 잘 모르는 것입니다 ㅠㅠ)

 

  • Material
    • 유니티 에셋을 임의로 추가해서 충돌시 탄성 (Bounciness) 및 마찰럭 (Friction)을 설정합니다.
    • 오브젝트를 튕길 때 탄성력이 크면 높게 튕기고 마찰력이 크면 미끄러질 때 천천히 미끄러집니다!
  • Is Trigger
    • 해당 물체가 다른 물체와 충돌을 할지 말지를 선택하는 속성입니다.
    • 충돌할 때 발생시킬 이벤트는 필요한데 충돌 자체는 필요 없을 때 사용합니다. 
  • Used by Effect
    • 이펙터를 사용할지 말지에 대해 설정합니다
  • Offset
    • 현재 위치를 기준으로 충돌 경계선의 위치를 x, y축을 기준으로 변경합니다.
  • Size
    • 충돌 경계선의 크기를 해당 스프라이트를 원점으로 x, y축을 변경합니다.

 

그 다음으로는 Collider의 종류에 대해서 알려드리겠습니다.

(정말 자주 사용하는 콜라이더만 설명하겠습니다.) 

 

  • Box Collider
    • 단어 그대로 사각형 모양의 콜라이더입니다.
  • Circle Collider
    • 단어 그대로 원형 모양의 콜라이더입니다.
  • Polygon Collider
    • 스프라이트 모양에맞춰서 알아서 충돌 경계선의 범위가 생기는 콜라이더입니다.
  • 참고
    • Edge Collider배경에 선으로 충돌체를 구성하는 경우에 사용하는 데
    • Edge Collider서로 충돌하지 않습니다!

< Edge Collider 요소끼리는 서로 충돌하지 않습니다! >

 

1-3. Collider의 사용법

일단 먼저 Collider가 충돌을 처리하려면

2개의 오브젝트가 모두 Collider 컴포넌트가 있어야하고

2개의 오브젝트 중 1개의 오브젝트는 꼭 Rigidbody 컴포넌트가 있어야 합니다!

(Player는 이미 Rigidbody 컴포넌트가 있습니다!)

 

< Collider 적용 방법 >

 

이제 저번 포스팅에서 중력을 0으로 설정헀던 것을 다시 중력 1로 돌려놓고 실행시켜보겠습니다.

 

 

문제가 2개 있습니다.

 

첫번째로 플레이어가 가다가 뚝하고 걸리는데요.

(이건 저도 고치는 법을 잘 모르겠습니다ㅠㅠ)

 

그리고 두번쨰로 플레이어가 들리는 현상이 발생하는데요.

이건 Rigidbody 컴포넌트에서 해결 가능합니다!

 

아래와 같이 Z축을 고정해주시면 됩니다!.

 

코드로 고정버리고 싶으신 분들은 Awake() (또는 Start() 함수) 함수에 rigid.freezeRotation = true;를 추가하시면 됩니다.

private void Awake()
{
    rigid = GetComponent<Rigidbody2D>();

    // Z축 고정
    rigid.freezeRotation = true;
    
    // 위와 같이 rigid 변수를 초기화 시킨 후에 적용해야 합니다!
}

 

 

일단 적용은 시켰는데요.

이걸로 끝이 아닙니다!

 

이번엔 메소드 (충돌 이벤트)에 대해서 알아보고 포스팅 마치겠습니다.

 

보기 전에 모든 메소드들이 collision이라는 이름의 매개변수를 가지고 있는데

collision해당 스크립트를 가진 오브젝트와 충돌한 오브젝트라고 할 수 있습니다!

잘 이해가 안 되실겁니다.

 

다시 한번 그림으로 설명 드리겠습니다!

위와 같이 설명할 수 있을 것 같은데요.

사각형메소드가 있는 스크립트를 가진 오브젝트이고

collider만 있는 그냥 오브젝트일 때

서로 충돌하게 되면 사각형의 스크립트 속 메소드가 실행되는데요.

 

이 때 그냥 오브젝트가 매개변수인 collision이 되는 것입니다!

 

Collision 메소드

구분 설명
OnCollisionEnter2D(Collision2D collision) 물체가 해당 메소드를 가진 오브젝트와 충돌한 후 1번 실행합니다.
OnCollisionStay2D(Collision2D collision) 물체가 해당 메소드를 가진 오브젝트와 충돌하는 동안 계속 실행합니다.
OnCollisionExit2D(Collision2D collision) 물체가 해당 메소드를 가진 오브젝트와 충돌을 벗어나는 순간 1번 실행합니다.

 

Trigger 메소드

여기서부턴 충돌 이벤트는 필요하지만 충돌 자체는 필요하지 않을 때 사용합니다.

Collider 컴포넌트의 Is Trigger를 체크한 뒤 사용해야 합니다!

(Collsion 메소드와의 로상의 차이점은 이름과 매개변수의 타입의 차이가 있습니다!)

구분 설명
OnTriggerEnter2D(Collider2D collision) 물체가 해당 메소드를 가진 오브젝트와 충돌한 후 1번 실행합니다.
OnTriggerStay2D(Collider2D collision) 물체가 해당 메소드를 가진 오브젝트와 충돌하는 동안 계속 실행합니다.
OnTriggerEnter2D(Collider2D collision) 물체가 해당 메소드를 가진 오브젝트와 충돌을 벗어나는 순간 1번 실행합니다.

 

 

충돌한 오브젝트의 정보를 가져오는 법

private void OnCollisionEnter2D(Collision2D collision)
{
	// 충돌한 물체의 이름을 콘솔창에 띄우는 로직
	Debug.Log(collision.gameObject.name);
}

 

 

 

이상으로 포스팅을 마치겠습니다.

다음 포스팅에서는 클릭 이벤트에 대해서 공부해보겠습니다!