유니티 2d 콜라이더 모양 - yuniti 2d kollaideo moyang

유니티2D / / 2020. 11. 27. 00:51

이번 포스팅에서는 유니티에서 많이 사용하는 Collider 컴포넌트와 Rigid body 컴포넌트를 사용하는 것을 포스팅하도록 하겠습니다.

포스팅은 유니티 2D 게임 개발(게임 개발 프로그래밍)에 나온 에제로 진행합니다.

#1 유니티2D 개발 시작하기

안녕하세요 첫 포스팅입니다. 유니티2D 관련 포스팅을 진행하겠습니다. 게임개발에 필요한 지식을 전달하고 함께 학습하겠습니다. 먼저 유니티2D 개발 블로그 포스팅에 앞서 참고한 책을 소개합

my-develop-note.tistory.com

유니티 2d 콜라이더 모양 - yuniti 2d kollaideo moyang

Collider(콜라이더 : 충돌체)

콜라이더는 게임오브젝트에 추가하는 컴포넌트입니다.

유니티에서는 콜라이더를 통하여 오브젝트가 충돌이 일어났는지 확인합니다.

오브젝트를 어림한 모양을 만드는 "프리미티브 콜라이더" 를 사용을 하고 "프리미티브 콜라이더"는 프로세서의 부담을 덜어주는 장점을 가지고 있습니다.

유니티 2d 콜라이더 모양 - yuniti 2d kollaideo moyang

프리미티브 콜라이더는 Box Collider 2D 와 Circle Collider 2D가 존재합니다.

유니티 2d 콜라이더 모양 - yuniti 2d kollaideo moyang

PlayerObject > Add Component > Box Collider 2D 를 검색하여서 컴포넌트를 추가합니다.

유니티 2d 콜라이더 모양 - yuniti 2d kollaideo moyang

1. Box Collider 2D 컴포넌트의 이름 왼쪽에 보시면 아래 화살표 모양을 눌러 Box Collider 2D를 펼칩니다.

2. Box Collider 2D > Edit Collider > 도구 모양을 클릭하면 Scene뷰에 PlayerObject에 초록색테두리가 보이게됩니다.

이것이 바로 유니티에서 충돌이 일어났을때 확인하는 콜라이더 모양입니다.

저희는 Box Collider 2D 컴포넌트를 사용하기 때문에 Box모양으로 되어있는 것을 확인할 수 있습니다.

3. 초록색 테두리를 Object의 모양대로 확대/축소합니다.

4. 다시 Edit Collider > 도구모양을 클릭하여서 적용합니다.


Rigid body(리지드바디 : 강체)

리지드바디 컴포넌트는 유니티의 물리 엔진과 상호 작용할 수 있습니다.

리지드바디 컴포넌트로 중력과 같은 힘을 적용할 게임 오브젝트를 구별하고 적용합니다.

예를 들어 자동차 오브젝트에 가속 버튼을 누르게 되면 자동차가 가는 방향에 속력이 더 빨라지는 것을 볼 수 있습니다.

이러한 물리적 힘을 적용할 수 있게 해주는 것이 리지드바디 컴포넌트 입니다.

유니티 2d 콜라이더 모양 - yuniti 2d kollaideo moyang

PlayerObject > Add Component > Rigidbody 2D 컴포넌트를 추가하게 되면 PlayerObject에 Rigidbody 2D 컴포넌트가 추가가 된것을 볼 수 있습니다.

유니티 2d 콜라이더 모양 - yuniti 2d kollaideo moyang

Box Collider 2D 컴포넌트와 마찬가지로 Rigidbody 2D 컴포넌트의 이름 좌측에 화살표를 눌러서 Rigidbody 2D 컴포넌트를 펼칩니다.

1. Body Type > Dynamic(동적)

2. Mass(질량) > 1
3. Linear Drag(선 항력) > 0

4. Angular Drag(각 항력) > 0

5. Gravity  Scale(중력 크기) > 0

※Gravity Scale(중력 크기)를 1로 설정하고 게임을 진행하면 게임 오브젝트가 밑으로 한없이 떨어지는 것을 볼 수 있습니다. 이것은 중력 값이 설정이 되어서 그렇습니다.

저는 프로젝트 전체에 중력 값을 0으로 만들것이기 때문에 

유니티 2d 콜라이더 모양 - yuniti 2d kollaideo moyang

Edit > Project Settings > Physics 2D > Gravity > Y 값을 0으로 바꾸었습니다.

※ Body Type은 3가지 Type이 존재합니다.

1. Dynamic(동적) : Dynamic은 다른 오브젝트와 충돌하거나 상호작용할 수 있습니다.

2. Kinematic(키네마틱) : Kinematic은 중력 등 외부의 물리적 힘에 영향을 받지 않습니다. 속도를 지닐 수 있지만 보통 스크립트를 통하여 Transform 컴포넌트의 값이 바뀔 때만 움직입니다.

3. Static(정적) : Static은 게임 안에서 오브젝트가 절대 움직이지 않습니다.

마지막으로 Ctrl + S를 눌러 Scene을 저장합니다!


감사합니다! :)

DNF LOVE

Programming/Unity

[Unity-2D 러닝 게임 만들기 6] Unity의 충돌 처리(Collision, Trigger)

botho 2019. 8. 1. 17:15

Unity에선 여러 충돌 처리를 지원해준다. 그 중 가장 대표적인 두 가지는 Trigger와 Collision이다.

이 둘의 차이와 함께 충돌 처리를 해보도록 하자.


1. 충돌처리 조건

충돌이 일어나기 위해서는 충돌이 일어나는 두 오브젝트 모두 Collider를 가지고 있어야 한다. 그리고 동적으로 움직이는 상대에게는 Rigidbody가 붙여져 있어야 한다.

우리는 이전 포스팅에서 Coin Object만 셋팅했지 Collider를 붙이진 않았었다.

유니티 2d 콜라이더 모양 - yuniti 2d kollaideo moyang

이렇게 드래그 해서 컴포넌트를 붙이면 드래그 한 4개 모두 동시에 Box Collider 2D가 붙여진다.

유니티 2d 콜라이더 모양 - yuniti 2d kollaideo moyang

Collider를 붙이면 Scene에서 Object 주변에 초록색으로 Collider가 붙여져 있는것을 확인 할 수 있다.

초록색으로 되어 있는 부분은 충돌체의 범위이다. 즉 충돌을 감지하는 영역이다.

또 이 Collider를 Inspector창을 통해 수정할 수 있다. 보통은 Object의 크기에 알맞게 자동으로 주어 지지만, 게임 난이도를 수정하기 위해서라던지 다양한 이유로 충돌체의 크기를 수정할 수 있다.

또, Collider에는 여러 종류가 있으니 유니티 API를 참조하길 바란다.


2. Collision 

Collision은 물리적인 연산을 하며 충돌을 감지한다. Collision 처리를 하려면 둘 중 하나에는 반드시 Rigidbody가 붙여져 있어야 하며, 이 Rigidbody의 Kinematic 속성이 꺼져 있어야 한다.

Collision에는 3가지 종류가 있다.

함수명

쓰임새

VoidOnCollisionEnter(Collisiono)

충돌이 시작되는 순간 호출

VoidOnCollisionStay(Collisiono)

충돌이 되고 있을 때 매 프레임 마다 호출

VoidOnCollisionExit(Collisiono)

충돌이 끝날 때 호출

이것은 3D기준이다.

collider2D혹은 Rigidbody2D를 붙일 수 있는 2D인 경우 void OnCollisionEnter2D(Collision2D o)이렇게 해야 한다.

void OnCollisionEnter2D(Collision2D other) 
    {
        print(other.gameObject.name);
        if (other.gameObject.name == "coin")
        {
            print(other.gameObject.name);
        }
}

이렇게 쓸 수 있다. 이 코드는 PlayerController스크립트에 붙여져 있으며, 충돌할때 OnCollisionEnter2D함수를 불러온다. 함수의 파라미터로 Collision2D 객체가 들어오면 other을 이용하여 이와 충돌한 Object에 대해 처리를 할 수 있게 된다.

충돌하자마자 충돌한 Object의 이름을 console에 출력하고, 만약 충돌한 상태 Object의 이름이 "Coin"이면, 그 Object의 이름을 또 다시 console에 출력하라는 뜻이다.


3. Trigger

Trigger은 두 오브젝트 간의 물리적 연산을 하지 않고 충돌을 감지할 때 사용된다. 

함수명

쓰임새

VoidOnTriggerEnter(Colliderc)

충돌이 시작되는 순간 호출

VoidOnTriggerStay(Colliderc)

충돌이 되고 있을 때 매 프레임 마다 호출

VoidOnTriggerExit(Colliderc)

충돌이 끝날 때 호출

두 Object가 충돌할 때, Object가 밀려나거나 튕겨 나가지 않고 그대로 통과하게 된다는 뜻이다.

유의해야할 점은 충돌하는 두 Object의 Collider에 Is Trigger를 활성화 해야 한다. 

우리는 Player에게 Rigidbody가 붙여져 있고 중력을 설정해 두었다. 얘의 Trigger가 활성화가 된다면 바닥체를 뚫고 아래로 끊임없이 내려갈 거다. 

그러므로 Is Trigger는 Coin들에게 붙여주도록 하자.

유니티 2d 콜라이더 모양 - yuniti 2d kollaideo moyang
void OnTriggerEnter2D(Collider2D o){
        if(o.gameObject.name == "Coin")
        {
            print(o.gameObject.name);
        }
}

우리는 Coin이 움직이지 않고 부딪치면 이 Coin이 사라지며 Score의 점수가 올라가는 것을 구현해야 하기 때문에

물리적 연산이 이루어 지지 않은 Trigger를 사용하도록 하겠다.

유니티 2d 콜라이더 모양 - yuniti 2d kollaideo moyang

이렇게 말이다!

그런데 문제가 생겼다. 코인은 여러개 이고 각 순서에 맞게 Coin, Con 2, Coin 3, Coin 4 이라는 이름을 붙였는데 우리의 코드는 Coin하나만 조건문에 있다! 이럴 때 조건문을 계속 만들어 줘야 하는가?

아니다. Unity에서 Tag기능이 있다.


4. Tag

Tag는 말 그대로 태그이다. 오브젝트들의 속성들에 맞게 정리? 해주기 위해 사용된다.

유니티 2d 콜라이더 모양 - yuniti 2d kollaideo moyang

태그틑 인스펙터 창에서 해당 오브젝트의 Tag를 지정해줄 수 있고, Add Tag를 통해 새로운 태그를 만들 수 있다.

우리는 Coin이라는 이름의 새로운 태그를 만들어주고, Coin들을 드래그 하여 한번에 태그를 추가해주도록 하자.

이 태그의 쓰임새는,

void OnTriggerEnter2D(Collider2D o){
        if(o.gameObject.tag == "Coin")
        {
            print(o.gameObject.name);
        }
}

이렇게 쓸 수 있다. 충돌한 o의 Object의 tag가 Coin이면 충돌한 오브젝트의 이름을 출력하겠다는 뜻이다.


다음은 정말 러닝 게임 만들기 튜토리얼의 마지막 포스팅이다. 

코인과 Player가 부딪치면 코인은 사라지고 Score에 점수가 올라가는 것을 구현해보도록 하자.