유니티 오브젝트 풀링(몬스터 스포너)

Intro

몬스터 스포너 오브젝트 풀링 구현

오브젝트 풀링(object pooling)

오브젝트 풀링이란 계속해서 생성, 삭제되는 오브젝트로 인해 생기는 부하를 막기위해 미리 오브젝트를 만들어 둔다음 Active 시키는 방식을 의미한다.

몬스터 스포너 오브젝트 풀링 예제

public GameObject monster;
public static MonsterSpawner instance;
public Queue<GameObject> m_queue = new Queue<GameObject>();
public float xPos;
public float zPos;
private Vector3 RandomVector;

// Start is called before the first frame update
void Start()
{
    instance = this;

    for(int i=0; i<10; i++)
    {
        GameObject t_object = Instantiate(monster, this.gameObject.transform);
        m_queue.Enqueue(t_object);
        t_object.SetActive(false);
    }

    StartCoroutine(MonsterSpawn());
}

public void InsertQueue(GameObject p_object)
{
        
    m_queue.Enqueue(p_object);
    p_object.SetActive(false);
}

public GameObject GetQueue()
{ 
    GameObject t_object = m_queue.Dequeue();
    t_object.SetActive(true);
          
    return t_object;
}

IEnumerator MonsterSpawn()
{
    while (true)
    {
        if(m_queue.Count!=0)
        {
            xPos = Random.Range(-5, 5);
            zPos = Random.Range(-5, 5);
            RandomVector = new Vector3(xPos, 0.0f, zPos);
            GameObject t_object = GetQueue();
            t_object.transform.position = gameObject.transform.position+ RandomVector;
        }
        yield return new WaitForSeconds(1f);                    
    }     
}

반복문을 통해 지정된 몬스터 프리팹 오브젝트를 생성하고 Queue에 넣고 비활성화 시킨다.

그리고 큐에 담는 함수와 꺼내는 함수를 정의한다.

코루틴을 통해 1초마다 큐에 담긴 오브젝트를 꺼내오도록 했다. ( 위치는 스포너 주변 랜덤으로 설정 )

몬스터 사망시

public override void Die()
{

    gameObject.SetActive(false);
    hpBar.SetActive(false);

    GetComponent<MonsterAttack>().enemies.Clear();
    GetComponent<MonsterState>().detected.Clear();

    MonsterSpawner.instance.InsertQueue(gameObject);    
}

몬스터가 사망시 비활성화 시키고 감지된 플레이어 배열을 초기화시킨다음 스포너의 큐에 집어넣는다. 그러면 코루틴에 의해 큐에담긴 몬스터가 다시 활성화된다.

재활성화 시

private void OnEnable() // 오브젝트 풀링에의해 다시 활성화될시 정보 초기화
{
    if (hpBar!=null)
    {
        hpBar.SetActive(true);
        HP = (int)MaxHp;
        hpSlider.value = 1.0f;
    }
}

오브젝트가 활성화될 때 실행되는 OnEnable 함수를 통해 다시 체력과 체력바를 초기화 시켜준다.

실행 결과

gif

오브젝트 풀링으로 생성된 오브젝트를 재활용하여 생성 삭제에 의한 메모리 낭비를 막을 수있게되었다.

참고 자료

https://youtu.be/Qc-JfTpZ5qg

태그: ,

카테고리:

업데이트:

댓글남기기