본문 바로가기

ㄱㅔ임 ㄱㅐ발

똥 피하기 게임을 만들어보ㅈㅏ!(2. 플레이어와 똥 오브젝트 만들기, Rigidbody와 Collider 이해하기)

이번엔 게임 씬을 구현하겠습니다!

 

게임 씬에는 플레이어와, 플레이어가 떨어지지 않도록 막아주는 바닥, 똥 오브젝트, 똥 오브젝트를 생성해줄 스크립트가 필요하겠네요!

 

먼저 바닥부터 만들어보죠!

하이라키 우클릭 > 2D Object > Sprites > Square

Square를 한 개 만들고 Square의 이름을 Ground로 바꿔주겠습니다.

이후 Add Component에서 Boxcollider 2D를 추가해줍시다!

그럼 이렇게 나오게 됩니다!(태그는 똑같이 안맞추셔도 괜찮습니다,)

이제 이 오브젝트를 카메라의 아래에 깔아줍니다.

짜잔

바닥은 이게 끝입니다. 정말 쉽죠?

 

다음으로 만들건 플레이어입니다.

하이라키 우클릭 > 2D Object > Sprites > Circle

Circle 오브젝트를 하나 만들고 이번엔 이름과 태그를 Player로 바꾸겠습니다.

핑크색 예쁘죠?

저는 사이즈랑 색을 조금 바꿔줬습니다! 

Player오브젝트에 rigidbody 2D와 Circle Collider 2D를 추가해주고 플레이어 코드를 작성하러 가기 전에!

이 상태에서 작동을 시키면 어떻게 되는지부터 확인해보죠!

플레이어가 떨어지다가 바닥에 닿으니 멈추네요!!

왜 이런 현상이 일어나는 걸까요?

이 현상을 이해하기 위해선 저희가 오브젝트에 넣었던 rigidbody와 collider에 대한 이해가 필요합니다.

Rigidbody란?

Rigidbody는 적용되어있는 오브젝트가 물리엔진에 영향을 받도록 도와주는 컴포넌트입니다.

속성 값을 변경하여 물체의 마찰력, 공기저항 등을 변경할 수 있습니다.

Collider란?

Collider는 Collider가 적용되어있는 오브젝트들의 물리적인 접촉이나 상호작용, 충돌에 대한 모든 것을 관리합니다.

 

정리해보면 Rigidbody에 의해 Player는 아래로 낙하했고 Ground와 Player에 있는 Collider가 충돌하며 더 이상 바닥으로 떨어지지 않았습니다! 굉장히 신기하죠?

 

이제 Rigidbody와 Collider에 대해 알아보았으니 플레이어 코드를 작성해봅시다!

 

C#스크립트를 하나 생성하고 Player라고 이름을 넣어주겠습니다.

가장 먼저 구현할 기능은 플레이어의 이동입니다!

플레이어 이동 코드입니다.

이 코드에서 이동할 때 deltatime을 곱하는 이유는 Update라는 이벤트에 있습니다.

Update함수는 프레임당 한 번씩 발동되는데 그렇게 되면 400 fps인 유저와 20 fps인 유저의 움직임은 동일하지 않을 것입니다. 그렇기에 Time.deltatime으로 프레임과 프레임 사이의 시간을 한번 곱해줌으로써 결과를 비슷하게 만들어준 것이죠.

 

다음으론 똥 오브젝트를 만들고 플레이어와 충돌하도록 만들 겁니다.

다시 Circle 오브젝트를 만들고 오브젝트의 이름과 태그를 Poop으로, Rigidbody와 Collider를 추가해줍니다.

이때 Collider의 옵션에 있는 isTrigger를 켜주세요.

이제 다시 플레이어로 돌아가 충돌처리를 만들어보죠.

hp변수를 만들어준 후

충돌 처리에 관련된 코드를 작성해줍니다.

충돌 처리에 관련된 코드를 작성해줍니다.

OnTriggerEnter2D의 경우 두 Collider 중 한쪽의 Collider에 isTrigger가 켜져 있을 때 오브젝트와의 충돌이 일어난 경우 충돌 직후 발동하는 스크립트입니다.

hp의 경우 poop오브젝트에 닿았을 때만 줄어들 테니 hp를 줄인 이후 확인을 하여 0 이하일 때 게임오버 씬으로 보내겠습니다.

Destroy함수의 경우 매게 변수에 들어있는 오브젝트를 지우는데 오브젝트를 지우지 않는 경우 게임이 오래 지속되어 쌓인 오브젝트가 많아지면 게임의 성능에 영향을 줄 수 있기 때문에 지워주는 게 좋습니다.

이제 스크립트를 Player에 넣은 후 인스펙터 창에서 값을 넣어주고 돌려보면

 

잘 작동하네요! 히히

다음으론 움직일 수 있는 한계값을 만들어주겠습니다.

한계를 넘어갔을 때 한계값으로 포지션을 강제로 이동시킵니다.

실행하면

생각했던 대로 잘 작동하네요!

 

마지막으로 Poop오브젝트가 플레이어에 맞지 않고 떨어졌을 때의 예외처리를 한번 해주겠습니다.

Poop이라는 이름의 스크립트를 생성한 후

코드가 정말 짧죠?

해당 코드를 작성해주세요.

OnBecameInvisible의 경우 카메라에 한번 이상 보였던 오브젝트가 카메라 밖으로 나갔을 때 발동되기 때문에 내려왔다 사라지는 오브젝트를 지울 때 이용할 수 있습니다.

 

똥 오브젝트의 예외처리를 마지막으로 이번 글을 마치도록 하겠습니다.

다음 글에서 Prefab과 똥 생성기, 게임오버를 만들어보도록 하겠습니다.

긴 글 읽느라 고생하셨습니다!

 

질문이나 부족한 부분이 있으면 댓글 달아주세요. 빠르게 답장드리겠습니다!