Start()
함수는 다시 실행되지 않으므로 재활성화시마다 실행시킬 임의의 함수를 추가할 필요가 있다namespace ObjectPool
{
// Values or methods that other can use
public partial class EnemySpawner
{
}
// Values or methods that other cannot use
public partial class EnemySpawner
{
// 유니티가 제공하는 오브젝트 인터페이스를 저장할 변수
private IObjectPool<Enemy> _pool;
// 관리할 게임오브젝트 프리팹
[SerializeField] private GameObject enemyPrefab;
private List<Transform> _spawnPos = new List<Transform>();
}
// body of MonoBehaviour
public partial class EnemySpawner : MonoBehaviour
{
private void Awake()
{
// 생성, 활성화, 비활성화, 삭제 시 호출할 함수와 풀의 최대 사이즈를 입력받음
_pool = new ObjectPool<Enemy>(CreateEnemy, ActivateEnemy, DeActivateEnemy, OnDestroyEnemy, maxSize:20);
foreach (Transform child in transform)
{
_spawnPos.Add(child);
}
}
void Start()
{
StartCoroutine(_SpawnEnemy());
}
}
// body of others
public partial class EnemySpawner
{
private IEnumerator _SpawnEnemy()
{
while (true)
{
Vector3 pos = _spawnPos[Random.Range(0, _spawnPos.Count - 1)].position;
Enemy enemy = _pool.Get();
enemy.transform.position = pos;
enemy.Init();
yield return new WaitForSeconds(1f);
}
}
// 풀이 비어있을 경우 오브젝트 인스턴스를 생성하여 반환하는 함수
private Enemy CreateEnemy()
{
Enemy enemy = Instantiate(enemyPrefab).GetComponent<Enemy>();
enemy.SetManagedPool(_pool);
return enemy;
}
// 오브젝트 인스턴스를 풀에서 빼낼 때 실행하는 함수
private void ActivateEnemy(Enemy enemy)
{
enemy.gameObject.SetActive(true);
}
// 오브젝트 인스턴스를 풀에 다시 넣을 때 실행하는 함수
private void DeActivateEnemy(Enemy enemy)
{
enemy.gameObject.SetActive(false);
}
// 오브젝트 인스턴스를 삭제하는 함수
private void OnDestroyEnemy(Enemy enemy)
{
Destroy(enemy.gameObject);
}
}
}