[ 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 메서드로 원형은 다음과 같다.
- Parameters :
- 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를 리젠하는지 이해가 되었을 것이다. 이 테크닉도 당연히 여러 게임에 응용할 수 있다.
해당 기능은 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, Vector3 position, Quaternion rotation, Transform parent);
- Parameters :
| original | 복사할 원본 Object |
| position | 복사될 Object의 position |
| rotation | 복사될 Object의 rotation |
| parent | 복사될 Object에 할당할 부모 Object |
| instantiateInWorldSpace | true : 월드 좌표를 기준으로 생성 false : Parent 좌표를 기준으로 생성 |
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를 리젠하는지 이해가 되었을 것이다. 이 테크닉도 당연히 여러 게임에 응용할 수 있다.