의식의 흐름대로 게임 만들기 6. 적과 총알의 충돌 처리

2023. 7. 22. 16:02GAME/Unity

이제 총알을 발사했습니다.

 

발사하면 끝인가요? 맞는 적이 있어야겠죠.

 

간단한 적을 만들어 봅시다.

 

빨간 삼각형을 만들고, Enemy Script를 제작해서 붙여줍시다.

Enemy는 일단 기본적으로 Hp를 가지고 있습니다. 

자신의 체력을 10으로 가지고, 무언가에 맞으면 맞았다고 실행하는 함수를 하나 만듭니다.

 

맞았을때는 자신의 체력을 1 감소시키고

체력이 0 이하라면 Destroy 함수를 통해서 삭제 요청을 해서 삭제됩니다.

 

여기서 this 라는것은 또 처음보는데요, this는 간단합니다. 자기 자신을 의미하는 키워드입니다.

 

저번 시간에 Instantiate 함수로 총알 설계도를 가지고 총알 객체를 생성했는데요. 

 

같은 설계도를 가지고 생성된 여러 객체(인스턴스)중에 자기 자신을 의미하는겁니다..

 

이해가 안되시죠? 간단하게 예시를 들자면.. 총알 설계도를 가지고 총알을 5개 만들었습니다.

하지만. 총알이 땅에 떨어졌을때 총알을 지워라 라고 해버리면 총알 5개 모두가 지워집니다.

 

떨어진 자기 자신만을 지워야 하잖아요? 그럴때 this를 통해서 자기 자신을 삭제할 수 있습니다.

 

this는 기본적으로 생략이 되어있으나, 저도 입문자는 this를 모두 쓰는게 좋다고 배웠으니 써 봅시다.

 

OK. 이제 우리는 총알이 발사되고 적이 맞았을때의 처리를 했습니다. 

 

하.지.만?

 

중간이 없죠 중간이

 

제일 중요한 총알과 적이 서로 부딪혔을때가 없습니다.

 

부딪혔을때란 충돌을 의미합니다.

 

 

유니티에서 충돌 처리를 하려면 Collider가 필요합니다. Collider는 몸체입니다..

 

비유를 하자면 지금 상태는 물입니다. 형태가 없습니다. 뭐가 들어오든 그냥 뚫려버립니다.

 

 

하지만 물을 병에 따르면 물을 만지려고 하되 병을 만지겠죠?

 

그런겁니다. 콜라이더는 병 즉 몸체,껍데기에 해당합니다.

 

적과 총알 모두 물 상태기에 Collider를 넣어줍시다.

 

Enemy를 클릭하고 AddComponent에 Polygon Collider 2d를 넣습니다.

 

Bullet은 Prefab으로 만들어놨죠. Prefab을 변경합시다.

 

총알은 원이니 Circle Collider를 추가합니다.

 

지금 상태를 그림으로 그리자면

 

이렇게 되겠죠. 윤곽선이 바로 몸체, 충돌의 경계선입니다.

 

일단 실행을 한번 해 보도록 하죠.

몸체가 있어도 여전히 뚫립니다...

 

왜냐하면 유니티 에서는 하나가 더 있어야지 충돌 처리가 가능합니다.

 

바로 Rigidbody이죠.

 

Rigidbody는 물리적인 기능을 담당합니다.

 

Rigidbody가 있어야지 충돌이 가능한 이유는 오브젝트가 많아질수록 충돌을 체크해야할 사항이 많아질것입니다. 그러므로 

기본적으로 동적충돌을 감지하는거죠. 상상을 해 봅시다.

 

결국에는 맵도 콜라이더일것입니다.

 

맵과 맵끼리 충돌 검사를 굳이 해야할까요?

맵은 움직이나요? 아니죠...

 

굳이 성능을 낭비할 필요가 없는겁니다.

 

움직이는 객체, Player 혹은 Enemy에서 맵과 충돌 체크를 하는게 맞겠죠.

자 이제.. Bullet에 Rigidbody를 넣어봅시다.

 

 

Bullet Prefab에 똑같이 Addcomponent를 해서 Rigidbody 2d를 넣고요. 실행을 해 봅시다.

 

 

아이코, 이게 무엇인가요 

총알이 날아가지 않고 떨어지네요.

 

이것은 Rigidbody의 영향이죠? 아까 말씀드렸다시피 물리적인 기능을 담당한다고 했습니다. 그러니 중력의 영향도 받죠.

 

Bullet은 초당 5m/s로 이동합니다. 하지만 중력 가속도(9.8m/s) 의 영향을 받아서 점점 밑으로 떨어지죠. 

 

이것도 간단합니다. 그냥 Rigidbody에서 속성을 설정하면 됩니다.

 

밑에 Gravity Scale . 중력 강도를 0으로 설정합니다. 그러면 중력이 적용이 안되겠죠.

 

 

좋습니다. 이제 총알이 뚫려가지 않고 적과 충돌하고 몸체를 미끄러지듯 움직입니다.

 

하지만, 부자연스럽습니다. 총알과 적은 그냥 뚫리되 충돌 처리만 했으면 좋겠습니다.

 

그것도 역시 가능합니다. 바로 Trigger 라는것이죠. 

 

Bullet의 Is Trigger를 체크해주시면 Trigger로 사용이 가능합니다.

적도 Trigger로 바꾸죠.

 

아까는 

이런 상태였죠.

 

트리거로 바꾸면?

 

충돌 했을때 체크만 하고 액션이 없고 서로 통과하게 되죠. 그러면 더 자연스러울 것 입니다. 

 

(물론 상황에 따라서 다르겠지만요...)

 

그러면 이제 충돌 체크 되었을때를 알아야 합니다.

 

유니티에서는 그것을 OnXXXEnter. 라고 명하죠.

 

XXX는 기본적으로 Collider를 사용하는지.. Trigger를 사용하는지에 따라서 결정됩니다.

 

Trigger를 사용했으니 OnTrigger Enter가 되겠죠.

 

Enemy Script에 이것을 작성합니다.

 

저희는 2d 게임이니까 2D를 붙입니다.

 

그리고 실행을 해 본다면..

충돌 처리가 되어서 총알과 10번 충돌했을 때, 적이 파괴되는 모습입니다.

 

충돌 처리는 여기서 마칩니다.

담아야 할 내용이 많아서 생각보다 길어졌네요ㅠ

감사합니다.