Object Pooling을 위한 Tool 제작
Unity에서 오브젝트를 생성(Instantiate)하거나 파괴(Destroy)하는 작업의 비용은 매우 크다. 따라서 게임 플레이 중 오브젝트를 많이 생성할 경우 해당 프레임의 연산량이 많아져 화면이 끊기는, 스파크 현상이 발생할 수 있다.
이를 해결하기 위해 오브젝트를 미리 생성해 놓고 필요할 때 가져다 쓰는 오브젝트 풀링(Object Pooling) 기법을 사용한다.
MakeDNF에서도 캐릭터가 이동하거나 스킬을 사용할 때 생성되는 이펙트나 투사체에 오브젝트 풀링 기법을 적용했다. 하지만 미리 생성한 오브젝트에 접근하기 위해 파라미터로 주로 String 타입의 변수를 사용했다.
// Spawn the object from the object pool by using the name of the prefab
GameManager.ObjectPool.SpawnFromPool("Meteor_FireHero");
하지만 String 타입의 변수는 오타의 위험성이 있으며, String을 비교할 때마다 파라미터를 위한 새로운 메모리를 계속해서 할당해야 했기에 GC의 타겟이 된다는 문제점이 존재했다.
그래서 제한된 목록안에서 선택할 수 있고 GC의 타겟에서 벗어날 수 있는 Enum 타입으로 오브젝트에 접근할 수 있도록 Enum 스크립트를 작성해주고 Prefab을 관리하는 Tool을 작성했다.
새로운 데이터를 추가 및 제거가 가능하며 Prefab 오브젝트를 할당할 수 있다.
이후 데이터를 저장할 경우 템플릿 파일로 Enum 파일을 작성한다.
// EnumTemplate.txt (템플릿 파일)
public enum $ENUM$
{
NONE = -1,
$DATA$
}
// EObjectPoolList.cs (작성된 스크립트)
public enum EObjectPoolList
{
NONE = -1,
Fireball_1_FireHero = 0,
Fireball_2_FireHero = 1,
Meteor_FireHero = 2,
Side_Flame_FireHero = 3,
Flame_Strike_FireHero = 4,
}
이렇게 String 변수를 사용하지 않고 Enum을 활용하여 Object Pool에 접근해 오브젝트를 가져올 수 있다.
// Spawn the object from the object pool by using the enum value of the prefab
GameManager.ObjectPool.SpawnFromPool(EObjectPoolList.Meteor_FireHero);
해당 툴을 기반으로 비주얼 이펙트나 사운드 이펙트도 똑같이 Tool을 제작하여 사용하여 최대한 String 변수의 사용을 지양하고자 했다.