[ Survival Shooter 5 ] Enemy 재생성 설계하기

Enemy의 Re-Spawn, 즉, Enemy의 재생성은 게임을 진행하는 중요 요소 중 하나이다.

해당 기능은 Managers 폴더의 EnemyManager Script가 담당하고 있으며, 내용은 다음과 같다.



현재는 3종류의 Enemy Object가 있는데, 물론 하나의 Script에 통합관리 할 수도 있겠지만, 해당 프로젝트에서는 Enemy마다 Script를 하나씩 추가해주고 있다.
public 변수들의 역할은 이름을 보면 직관적으로 이해할 수 있다.

이 Script는 Enemy Manager라는 해당 기능만을 위한 비어있는 Object에 Component 로 들어간다.

이제 Script 를 천천히 살펴보자.

핵심 기능을 하는 메서드는 InvokeRpearing 으로, Start 함수에서 호출하고 있다.
public void InvokeRepeating(string methodName, float time, float repeatRate);
time 초에 methodName 메서드를 호출한 후,  repeatRate 마다 반복 호출하는 함수이다.
즉 스크립트에서는 Spawn 이라는 메서드를 spawnTime 초 후에 첫 호출하여, spawnTime 마다 반복한다는 의미이다.

InvokeRepeating에 의해 반복되는 Spawn의 내용에서 주의할 점은 Player의 체력이 0 이하라면 함수의 내용을 실행하지 않고 그냥 반환해 버리는 것으로 Spawn메서드의 기능을 형식적으로 종료하고 있다.
프로젝트에서는 게임이 종료되면 바로 다음 게임이 별다른 과정없이 바로 실행되기 때문에 이런식으로 코딩한것 같지만, InvokeRepeating 을 취소 키는 방법도 알아보고가자. 다음과 같다.


CancelInvoke(string methodName) 메서드로 Invoke 로 호출이 멈출수있다.


다음으로 알아봐야 할 것은 spawn 메서드의 핵심은 Instantiate 메서드로 원형은 다음과 같다.

public static Object Instantiate(Object original);
public static Object Instantiate(Object originalTransform parent);
public static Object Instantiate(Object originalTransform parent, bool instantiateInWorldSpace);
public static Object Instantiate(Object originalVector3 positionQuaternionrotation);
public static Object Instantiate(Object originalVector3 positionQuaternion rotationTransform parent);

 - Parameters :

original 복사할 원본 Object
position 복사될 Object의 position 
rotation 복사될 Object의 rotation
parent 복사될 Object에 할당할 부모 Object
instantiateInWorldSpace true : 월드 좌표를 기준으로 생성
 false : Parent 좌표를 기준으로 생성
 - Returns : 복사된 Object가 반환된다.

Instantiate 의 특별한 점은 GameObject 뿐 아니라, Component 도 복제 가능하다, 복제 시에는 모든 자식 객체 및 Component도 똑같이 설정되고, 당연하지만 원본이 비활성 상태라면 복제본도 비활성 상태로 복제되게 된다.

아래는 실행 시 original인 Enemy Object가 복제되는 모습이다.


마지막으로 public static float Range(float min, float max); 함수는 float형과 int형을 모두 매개변수로 전달받을 수 있는데, float 형은 min과 max 사이의 부동 소수점 숫자를 반환하고, int형으로 전달하면 min 이상 max 미만의 정수를 반환한다.

이 함수는 enemy의 Spawn 위치를 Random 하게 구하기 위해서 쓰여졌는데,
spawnPoints는 해당 Enemy의 Spawn 위치를 배열로 가지고 있는 데, 현재 프로젝트에서 Zombunny로 예를 들자면,
ZombunnySpawnPoint 의 위치는 다음과 같이 하나밖에 없다.



프로젝트에서는 0부터 spawnPoints의 크기만큼을 무작위로 반환하는데, 인스펙터 뷰에서 spawnPoints는 1이므로 한가지 밖에 반환이 되지 않는다.






나중에 프로젝트를 확장할 때 SpawnPoint를 여러개 추가하여 spawnPoints의 배열에 넣고 관리하면서, Enemy의 spawn 위치를 를 다양하게 하면 더 재밌는 게임을 만들 수 있을것이다.


이제 유니티에서 어떤식으로 Enemy를 리젠하는지 이해가 되었을 것이다. 이 테크닉도 당연히 여러 게임에 응용할 수 있다.