오늘은 하루종일 강의를 수강하며 TopDownShooting 게임을 만들어보았다. 이전 프로젝트에서 다뤘던 내용도 있었지만, 이전에 사용해보지 못하거나 깊이 다루지 못했던 기능들을 배워볼 수 있었다. 오늘은 이러한 기능들을 정리해보겠다.
이미 '고양이 밥주기 게임'을 따라 만들어보고, 이를 토대로 투사체 발사 시스템을 따로 구현해보았는데, 이 때 배웠던 내용들을 잘 활용할 수 있었다.
RangeWeaponHandler 스크립트에서 projectileSpawnPosition이라는 Transform 변수를 따로 두어 발사 위치를 지정하는 방식으로 쉽게 설계할 수 있었다.WeaponHandler 라는 모든 무기가 공통적으로 가져야 할 속성과 기능을 정의하는 기반 클래스를 생성했다.RangeWeaponHandler와 같은 파생 클래스가 이를 상속하였다. 각 무기 타입과 특성에 맞는 공격 방식들을 override 키워드를 사용하여 구현한다.Particle System을 통해 파티클의 구체적인 효과를 설정해주었다.CreateImpactParticlesAtPostion 메서드를 통해 충돌 지점에 파티클 효과를 생성한다.코루틴 활용
IEnumerator와 yield return을 통해 특정 시간만큼 실행을 잠시 멈췄다가 이어서 실행할 수 있다.Update 내에서 시간을 계산하여 이를 수행하여야 했는데, 이러한 계산 없이 시간 기반 로직을 작성할 수 있었다.//코루틴 예시
private Coroutine waveRoutine; // 현재 실행 중인 웨이브 코루틴 저장
[SerializeField] private float timeBetweenSpawns = 0.2f; // 적 생성 간격
[SerializeField] private float timeBetweenWaves = 1f; // 웨이브 사이 간격
.
.
.
public void StartWave(int waveCount)
{
waveRoutine = StartCoroutine(SpawnWave(waveCount)); // 코루틴 시작
}
private IEnumerator SpawnWave(int waveCount)
{
enemySpawnComplite = false;
yield return new WaitForSeconds(timeBetweenWaves); // 웨이브 시작 전 대기
for (int i = 0; i < waveCount; i++)
{
yield return new WaitForSeconds(timeBetweenSpawns); // 적 생성 전 잠시 대기
SpawnRandomEnemy(); // 랜덤 적 생성 로직 호출
}
enemySpawnComplite = true; // 현재 웨이브 종료
}
.
.
.
이전에는 모든 스크립트를 Scripts폴더 안에 다 넣어두거나 해봤자 Manager폴더 정도만 생성하는 정도였다. 하지만 본 강의를 따라하며 유니티 에디터 내의 프로젝트 파일 구조를 어떻게 해야할지를 많이 배웠다.
Scripts 폴더 구조Entity 폴더PlayerController, 적 EnemyController, 그 외 개체들에 대한 기본적인 로직을 모았다. 또한 이러한 개체들이 공유하는 기반 클래스도 BaseController를 통해 정리했다.Manager 폴더GameManager, 적들의 생성과 웨이브 관리 EnemyManager, 투사체 관리ProjectileManager 등 게임 시스템을 관리하는 역할을 하는 스크립트를 정리했다.UI 폴더Weapon 폴더Weaponhandler 및 무기 종류별 상속 클래스RangeWeaponhandler 등, 투사체 ProjectileController 등 무기 시스템과 관련된 스크립트들을 한 곳에 모아 관리하였다.