본문 바로가기
tips/유니티 게임만들기

유니티 강좌 6 - 총알 피하기 6/9. 콜리더와 충돌 감지

by 디지털 수공업자 2021. 3. 22.
반응형

 

1. 총알 충돌체 만들기

이제 총알이 player에 부딪히면 충돌했음을 감지하여 게임을 끝낸다. 여기에서는 게임오브젝트에 Collider라는 오브젝트의 충돌범위를 만들어주는 콤포넌트를 사용한다. bullet 프리팹의 Inspector에서 Add Component를 선택하고, collider 2D를 입력하고 검색결과로 나타난 목록 중에서 Circle Collider 2D를 눌러 추가한다. 동일한 이름으로 2D 글씨만 없는 것들은 3D에 쓰인다.

 

Project의 bullet 프리팹을 더블클릭하면 프리팹의 내용물이 씬으로 보여진다. Hierarchy의 bullet을 선택하면 총알 스프라이트에 초록색 테두리가 나타나는데, 이 초록색 테두리가 바로 Collider이다. 초록 테두리 안쪽이 충돌되는 영역이 되며 충돌 될 오브젝트에 있는 Collider가 이 범위에 닿으면 충돌을 감지할 수 있다. 혹시 이 범위가 스프라이트의 크기와 차이가 많이 나면 Circle Collider 2D 콤포넌트의 Edit Collider 오른쪽에 있는 아이콘을 누르고, 초록 테두리에 나타나는 초록 점을 잡아당겨 크기를 조절할 수 있다. 또는 Radius에 수치를 넣어 크기를 조절하거나 Offset에 중심축 위치 좌표를 넣어 조절한다.

총알 프리팹 수정씬에서 나오려면 Hierarchy에 보이는 bullet프리팹 아이콘의 왼쪽에 있는 화살표를 클릭한다.

 

2. player에도 Collider

마찬가지로 player도 Collider를 가지고 있어야 충돌감지가 가능므로 씬의 player 게임오브젝트에도 위와 같은 방법으로 Circle Collider 2D콤포넌트를 추가하고, 사이즈를 적당히 맞추어 준다.

아직 충돌감지 작업이 마무리 되지 않았지만, 충돌을 감지하게 되는 상황은 위와 같다. player에 있는 Collider 영역과 총알에 있는 Collider영역이 닿는 순간이 된다.

 

3. 충돌감지를 위한 isTrigger

Collider는 보통 Rigidbody라는 물리연산을 해주는 콤포넌트와 쌍으로 사용되는 경우가 많은데, 통상 그런경우에 충돌체가 게임안에서 충돌하면 물리법칙에 따라 튕기거나 밀리는 등의 움직임이 일어난다. 그런데 Collider 콤포넌트에 Is Trigger 옵션을 사용하면 불필요한 물리연산을 하지 않고 닿았는지 안닿았는지만 감지하게 된다. 

따라서, Collider2D콤포넌트의 IsTrigger 옵션이 켜져 있어야 하는데, 여기에서 총알이 닿았는지를 감지할 주체는 player가 될 것이지만 IsTrigger가 충돌하는 두 Collider2D 중에 어느 한 쪽에만 켜져 있어도 감지가 가능하고, 양쪽에 모두 켜져 있어도 문제가 없다.


4. 충돌 연산을 위한 Rigidbody

총알과 player에 충돌영역을 정하는 Collider2D는 모두 추가되었고 둘 중 어느 한쪽에 IsTrigger 옵션을 켜두어 충돌 감지를 위한 준비가 되면 마지막으로 player에 AddComponentRigidbody를 검색하여 Rigidbody2D를 추가한다. 그리고, Rigidbody2D 콤포넌트의 Gravity Scale0을 입력한다. 이것은 중력값이며, 0이 아닌 숫자가 있게되면 게임이 시작되고 player는 아래쪽으로 중력에 의해 떨어지게 된다.

  Rigidbody2D Collider2D IsTrigger
player O O 최소한 둘 중 하나 또는 둘 다
bullet X O

정리하면 위의 표에서 처럼 Rigidbody2D는 player에만, Collider2D는 player와 bullet 양쪽에 있어야하고, IsTrigger옵션은 둘 중 하나에만 켜져 있어도 되고, 양쪽 모두 켜져 있어도 된다.

 

5. 충돌 감지 스크립트

Player.cs에 위와 같이 작성한다. OnTriggerEnter2D( ) 함수는 유니티와 이미 약속된 함수로 이 스크립트가 콤포넌트로 사용되는 게임오브젝트에 있는 Rigidbody2D에서 다른 Collider2D가 닿는 순간 호출된다. 이 때 충돌을 일으킨 상대방 Collider2D 콤포넌트를 함수에 값으로 던져주게 된다.

지금까지 이 시리즈에서 어떤 함수를 호출할 때 소괄호 안에 값을 넣는 것은 여러차례 등장했었다. Debug.Log( )에 문자열을 넣어주었거나, Vector3( )에 세 개의 숫자를 넣어주었던 것과 비슷한 경우들이다. 4편에서 클래스안에 void MakeBullet( ) 함수를 별도로 만들고 Start( )안에서 MakeBullet( )로 호출했었던 것과 마찬가지로 함수를 호출하면 호출 받는 곳이 있게 마련이다. 

그렇게 호출하는 곳과 받는 곳은 구조가 동일하게 구성되어 문자열을 보내면 받는 쪽에서는 보내온 문자열을 담을 변수 선언을 괄호 안에서 하고, 정수를 보내면 그것을 담을 정수 변수를 선언해야한다.

다시 위의 OnTriggerEnter2D 함수를 보면 괄호 안에서 Collider2D형 변수 collider가 선언되었다. 총알이 충돌되어 Rigidbody2D가 충돌을 일으킨 게임오브젝트에 있는 Collider2D콤포넌트를 OnTriggerEnter2D 함수를 호출하면서 전달해주고, OnTriggerEnter2D 함수는 전달 받은 Collider2D를 collider변수에 담는다.

그리고 Debug.Log( )에 전달받은 collider를 보내주어 Console에 전달받은 collider가 무엇인지 출력을 한다.

지금까지는 Debug.Log( )에 문자열을 전달했었지만, 유니티에서 제공하는 스크립팅 API 설명을 보면 우리가 호출할 때 쓴 Debug.Log( )와 쌍을 이루는 저 너머의 함수의 생김새를 볼 수 있다. 괄호 안에는 string형 변수가 아니라 object형 변수 message가 있다. 우리는 여기에 문자열이 아닌 다른것을 던져주어도 오류가 나지 않는 이유다.

실행해보면 총알이 다가와 player에 닿는 순간 Console창에 메세지가 출력되므로 총알과 player의 충돌이 잘 감지되고 있다.

콘솔창의 메세지 어느 하나를 클릭해보면 메세지의 구체적인 내용이 아래에 표시된다.
아래줄부터 시작하여 맨 윗줄까지 작동된 경위가 나열되며, 맨 아랫줄 Player.cs파일 45번 째 열 OnTriggerEnter2D( ) 에서부터 Debug.Log( )가 호출되었음을 알수 있다. 가장 윗줄에는 Debug.Log( )에 전달한 collider가 부착된 게임오브젝트의 이름콤포넌트 이름이 출력되고 있다.

 

6. player 컨트롤 제어

5편 마지막 숙제로 이야기했던 player가 방향 버튼을 떼도 계속 이동하는 문제를 해결하여 버튼에서 마우스를 떼면 즉시 멈추도록 바꾸어보자. Player.cs에 위와 같은 함수를 추가한다. 이 함수가 호출되면 dir값을 "null"로 변경하여, Update( )에 있는 조건문에서 걸리지 않도록 만들어 준다.

이제 Canvas에 있는 각 방향별 버튼 게임오브젝트에 추가했던 Event TriggerPointerUp 이벤트를 추가하고, player 게임오브젝트를 연결하여 Player.cs에 있는 Player.Press_normal( )을 선택해준다.

결과적으로 모든 버튼 게임오브젝트의 Event Trigger에 PointerDown과 PointerUp 두 가지 이벤트가 있게 된다.

지금까지 작성된 Play.cs파일

Player.cs
0.00MB

7. 미리해보기

프리뷰하여 지금까지 작성한 내용이 잘 작동 되는지 테스트 해보고, 숙제로 4편에서 사용했던 스크립트를 사용하여 player에 충돌한 총알 게임오브젝트를 파괴해보자. 힌트로 Player.cs의 OnTriggerEnter2D에서 받은 collider변수에 .gameObject를 덫붙여서 collider.gameObject를 사용하면 총알 게임오브젝트에 접근할 수 있다는 점을 참고하자.

이 시리즈가 도움이 되셨다면 구독 & 공감 부탁드립니다.
이 시리즈가 계속 될 수 있는 힘이 됩니다.


OnTriggerEnter2D : docs.unity3d.com/kr/530/ScriptReference/MonoBehaviour.OnTriggerEnter2D.html
Collider2D : docs.unity3d.com/kr/530/ScriptReference/Collider2D.html
Rigidbody2D : docs.unity3d.com/kr/530/ScriptReference/Rigidbody2D.html

 

유니티 강좌 7 - 총알 피하기 7/9. RectTransform과 오브젝트 비활성

아래 내용은 6편에서 이어집니다. 1편 : boxwitch.tistory.com/180 6편 : boxwitch.tistory.com/191 총알 파괴 6편의 마지막에 주어진 미리해보기에 있던 내용이다. player에 총알이 닿으면 총알 게임오브젝트..

boxwitch.tistory.com

 

반응형

댓글