멍멍은댕댕의 개발공간

피하기 게임 만들기 - 3 <벽 충돌> [유니티 2D 기초 강좌] 본문

유니티 강좌/유니티 기초 강좌 (2D)

피하기 게임 만들기 - 3 <벽 충돌> [유니티 2D 기초 강좌]

멍멍은댕댕 2019. 9. 21. 21:06

피하기 게임 만들기 (이전 강좌)

1. 프로젝트 세팅: https://doggie-development.tistory.com/7

2. 캐릭터 움직이기: https://doggie-development.tistory.com/8

 

안녕하세요, 취미로 유니티 강좌를 작성하고 있는 "멍멍은댕댕"입니다.

 

저번 시간에는 캐릭터를 움직이는 방법에 대해 배웠습니다. 이번 시간에는 캐릭터가 통과하지 못하는 벽을 만드는 법에 대해 배워보겠습니다.

 

 

 

준비물

1. 유니티 최신 버전 (저는 2019.2.2로 작업했습니다.)

2. 저번 시간까지 작업한 작업물

 

 

 

강좌를 PDF로 보고 싶다면? 

피하기게임_3.pdf
0.88MB

 

 

 

 

멍댕 유니티 강좌 첫 번째 시리즈!

 

 

 

 

 

 

 

 

 

 

 

이번에는 캐릭터가 통과하지 못하는 벽을 만들 것입니다.

Box 스프라이트Scene에 끌어다 넣어 오브젝트로 생성해주세요.

 

 

하지만 오브젝트를 생성했다고 해서 바로 통과할 수 없게 되는 것은 아닙니다.

아직 두 오브젝트는 그저 그림일 뿐이기 때문입니다.

 

 

하이어라키 창에서 Box 오브젝트를 선택

인스펙터 창에 Box 오브젝트의 컴포넌트들이 보이도록 해주세요.

 

 

하단의 Add Component 버튼을 눌러 컴포넌트를 추가할 수 있습니다.

컴포넌트를 추가하여 새로운 특성을 줄 것입니다.

 

 

Physics 2D를 선택한 후, Box Collider 2D를 선택해주세요.

 

 

이러한 컴포넌트가 추가되었다면 성공입니다.

이 컴포넌트는 어떤 역할을 할까요?

 

 

 

네이버 영어사전에 따르면, Collide의 뜻은 충돌하다, 부딪치다입니다.

따라서 Collider충돌하는 물체, 충돌체 정도로 해석할 수 있습니다.

 

Box Collider 2D 컴포넌트는 단어의 의미와 같이 사각형 모양의 충돌체를 추가하는 것입니다.

그저 그림일 뿐이었던 오브젝트를 충돌할 수 있는 물체 만드는 것이죠.

 

 

오브젝트를 선택하면 충돌 가능 범위가 초록색으로 보입니다.

 

충돌체가 다른 충돌체와 만나면 서로 충돌이 일어나, 통과할 수 없겠죠.

이런 원리로 벽을 만들 수 있습니다.

 

 

Player 오브젝트에도 Box Collider 2D 컴포넌트를 추가하여

벽과 플레이어가 서로 부딪칠 수 있도록 만들어줍시다.

 

 

그런데 이 상태에서도 캐릭터가 벽을 통과할 수 있습니다.

왜냐하면 충돌체는 추가했지만, 충돌을 계산하는 물리엔진을 추가하지 않았기 때문입니다.

 

 

플레이어 오브젝트에 물리엔진을 추가할 것입니다.

Physics 2D를 선택한 후, 스크롤을 내려 Rigidbody 2D를 선택해주세요.

 

 

이런 컴포넌트가 추가되었으면 성공입니다.

 

사실 Rigidbody의 뜻은 강체, 물리학에서 말하는 이상적인 고체를 뜻합니다.

물리 법칙이 적용되는 강체의 성질을 추가하는 것인데, 그냥 대충 물리 엔진을 추가한다고 생각하시면 됩니다.

 

 

그런데 재생을 해보면 키보드를 누르지 않아도 캐릭터가 아래로 서서히 떨어집니다.

마치 아래로 중력이 작용하는 것 같네요! 이유가 무엇일까요?

 

 

Rigidbody 2D에는 중력을 계산하는 속성까지 들어있기 때문입니다.

이외에도 엄청나게 많은 속성이 들어있지만, 자세하게 다루지는 않겠습니다.

 

 

Gravity Scale 값을 0으로 만들어 중력을 없애주세요.

 

그리고 Constraints를 누르면 접혀 있던 속성들이 나타나는데,

여기서 Freeze RotationZ 값에 체크를 해주세요. (캐릭터가 빙글빙글 도는 것을 방지)

 

 

이제 실행을 해 보면 캐릭터가 벽을 통과하지는 못하는데 어딘가 이상하네요.

왜 이렇게 덜덜 떨리는 것일까요?

 

 

이유가 복잡하므로 대강 설명드리자면,

움직임을 물리엔진을 이용해서 구현하지 않았기 때문입니다.

 

캐릭터가 벽을 뚫지 못하도록 막는 것은 물리엔진에 의해 구현되는데, 캐릭터가 움직이는 것은 물리엔진이 아닌 그냥 Update 함수에서 직접 캐릭터의 위치를 변경하는 방식으로 구현되기 때문에, 둘이 궁합이 잘 맞지 않아서 이상한 모양새가 되는 것입니다.

 

따라서 물리엔진을 이용해 움직이게 하는 방법을 알려드리겠습니다.

 

 

위처럼 코드를 추가해주세요. 캐릭터를 움직이게 하는 세 번째 방법!

 

 

우선 move_method0일 때 실행되는 부분모두 선택하고, 복사해주세요.

 

 

그 다음 아까 추가한 move_method2일 때 실행되는 부분에 붙여넣어주세요.

 

 

그리고 위와 같이 맨 아래에 있던 코드를 삭제하고, 새 코드를 추가해주세요.

 

 

최종적으로 코드가 이렇게 되면 됩니다.

마지막 줄에 추가한 코드에 대해 설명해드리겠습니다.

 

 

Transform 이외의 대부분의 컴포넌트GetComponent를 통해 직접 컴포넌트를 가져와야 이용할 수 있습니다. 따라서 위와 같이 작성해야 합니다.

 

 

 

기존의 해당 코드는 오브젝트의 위치를 1프레임마다 직접 변경하는 것이었지만,

 

 

추가한 코드는 오브젝트의 Rigidbody2D 컴포넌트를 받아온 후, Rigidbody 2D에 들어있는 속도 속성(velocity)조절하여 물리엔진에 의해 위치가 변경되도록 하는 것입니다.

 

 

 

Move_method 값을 2로 변경하고 플레이를 해봅시다.

분명 움직이기는 하는데, 정말 느립니다. 왜 그럴까요?

 

 

 

Update 함수 안에서 Translate 함수로 직접 위치를 변경할 때는 “1프레임 당 속도였지만, Rigidbody 2D에 들어있는 속성인 velocity초속을 말합니다.

 

60프레임이 약 1초이므로, 기존 속도보다 약 60배 느려진 것이죠.

 

 

 

Speed를 대강 5정하면 적당한 속도가 나옵니다.

 

그리고 박스에 부딛히면 박스를 뚫지 않고, 아주 적절하게 멈춥니다.

물리엔진을 통해 움직이도록 했기 때문이죠.

 

 

박스의 크기를 조절하여 을 만들어보세요.

 

 

Box 오브젝트를 복사 + 붙여넣기하며 원하는 형태로 맵을 만들어주면 됩니다.

 

 

 

 

충돌에 대해 배웠습니다.

다음 시간에는 충돌을 이용하여 아이템과 적을 만드는 법에 대해 알려드리겠습니다.