의식의 흐름대로 게임 만들기 10. 적 생성

2023. 7. 25. 00:11GAME/Unity

적 생성은 어떻게 해야할까요?

적도 역시 같은 적을 계속 생성하니까...

설계도와 공장이 필요하죠..

 

결국에는 총알 발사와 똑같은 개념입니다.

 

빠르게 만들어 봅시다.

 

우선 Enemy를 Prefab으로 만들어야겠죠.  

 

전에 해봤으니 설명은 생략합니다.

 

이제 적을 생성할 스포너가 필요합니다.

 

마인크래프트를 해보셨다면 스포너라고 보셨을겁니다. 스포너 근처, 정해진 위치에서만 스폰되죠?

그런겁니다. 

Spawner를 만들어 봅시다.

 

Create empty 로 빈 오브젝트를 하나 만들어 주시고 그 밑에 자식으로 4개를 만들어 줍니다.

 

Inspector창 왼쪽에 눕혀진 캡슐같은것을 클릭하시고 빨간색으로 변경하시면

빈 오브젝트여도 이렇게 시각적으로 볼 수 있습니다.

(이런것을 Gizmo라고 합니다.)

지금 중요한것은 배치이니 플레이어의 상하좌우로 Spawner를 배치합니다.

 

아직 Spawner의 기능이 없습니다. 이제 코드를 이용해야합니다.

 

Spawner 스크립트를 하나 만들어주고

 

상하좌우의 Spawner 위치를 얻기 위해서 Transform 배열을 선언합니다.. 

 

배열은 기차같은 연속된 공간입니다. Spawner 1번 Spawner 2번 .....4번까지 담는 공간이라고 생각하시면 됩니다.

 

여기서 기초까지 다루면 너무 길어지기 때문에 간단히 언급만 하겠습니다.

 

일단.. 스폰부터 해보죠.

 

스포너 1번부터 스포너 4번까지 돌면서 1234~1234~1234 이런식으로 스폰을 하려고 합니다.

 

배열에는 Index가 있습니다. 번호라고 생각하시면 됩니다. 이것을 증가시키면 되겠죠.

 

자 적을 생성하려면 결국 적 설계도가 있어야 합니다. 설계도를 받고요.

 

Enemy를 하나 생성하고

 

해당하는 번호의 스포너 위치로 이동시키죠.

 

index는 번호라고 했죠?

번호를 1 증가시키면 다음번에 실행될때는 1번 스포너..그다음은 2번스포너의 위치로 Enemy가 스폰이 되겠죠.

 

굿입니다.

 

저번에도 이것을 줄여보았죠.

 

이런식으로 줄이면 됩니다. Quternion.identity는 기본 ..0,0,0 값입니다.

 

자 이러면 생성이 되겠죠 하지만 문제가 아직 많습니다.

 

index는 번호입니다. 여기서는 번호가 계속 증가하고있죠.

하지만 우리의 스포너 번호는 0,1,2,3 까지입니다. 즉 이 코드는 번호의 제한이 없습니다.

 

이런 경우 4,5,6..~~.. 번호가 없으니 스폰도 안되고 index 오류가 생깁니다. 

 

따라서 있는 번호 까지 index가 증가하되, 0,1,2,3 까지 되었을때 다시 0,1,2,3이 되게끔 하고싶습니다.

 

쉽죠? 제일 간단히 할 수 있는 방법은 그냥 비교를 하는 방법입니다.

 

간단히 이런식으로도 할 수 있겠지만.... 더 좋은 방법이 있습니다.

 

바로 나눗셈을 이용하는 방법이죠. 정확히는 나머지를 이용하는 방법이라고 할 수 있습니다.

 

간단한 원리입니다. 1,2,3,4,5 이 있습니다. 그리고 5가 되면 초기화 하고 싶습니다.

근데 우리가 조건을 걸지 않아도 수학적으로 자연스럽게 이게 됩니다. 

 

최대치가 5입니다.

 

그러면 모든 숫자를 이 최대치로 나누어 보는 것 입니다.

 

1을 5로 나누어 봅니다. 나누어 지지 않죠? 그럼 나머지는 1이네요. 

2도 5로 나누어 지지 않으니 나머지는 2입니다.

쭉 가서 5로 가면은 5/5는 나누어 지니 나머지는 뭐죠? 0이네요! 이게 뭐죠? 초기화 되었네요!

 

만약 6으로 가서 최대 번호의 범위를 넘어갔다고 해도 6 / 5의 나머지는 결국 1입니다. 10으로 가도 100으로 가도 똑같고요

 

이러한 원리를 사용하는 것 입니다.

 

이런식으로 바로 해도 되겠지만, index는 계속 증가하기 때문에 언젠가는 오버플로우가 일어납니다. 따라서 초기화된 값을 다시 Index에 넣어주는 작업을 합니다.

 

여기서 한번 더 줄인다면 결국 현재 번호 + 1의 나머지를 구하는것이기 때문에

 

와우. 두줄로 코드를 줄였네요 간결화의 체감이 확실히 느껴지실겁니다.

 

자 이제 스폰은 되지만.. 실행을 하시면 큰일나죠. 왜냐하면 1초에 60번이 스폰되기 때문이죠 

 

이것도 저번 총알 발사처럼  시간을 이용해서 제어를 해보죠.

 

이건 전에 했었으니 Pass 

 

 

스폰하는 기능은 따로 함수로 빼줍니다. (기능 = 함수)

 

이제 Spawner 부모 객체에 방금 만든 spawner 스크립트를 넣고 

 

Inspector 창 우측에 잠금장치 아이콘이 있습니다. 클릭하시고

 

자식객체를 모두 선택합니다. 그리고 Spawners 이름에 그냥 드래그합니다.

 

자동으로 꽂히죠. 

 

아까 만들어두었던 Enemy Prefab도 넣습니다.

Spawn Time과 Enemy Hp는 너무 많아서 2로 줄이겠습니다. 

 

(이제 자물쇠를 다시 풀어주세요)

 

실행을 해 보면..

 

 

상하좌우에 적이 생성되네요! 좋습니다.