본문 바로가기

Unity

2025년1월5주(1/27~2/2)

오브젝트풀을 추가하자.

 

 

using System.Collections.Generic;
using UnityEngine;

public class ObjectPool : MonoBehaviour
{
    public GameObject prefab;
    public int poolSize = 10;

    private Queue<GameObject> pool = new Queue<GameObject>();

    private void Start()
    {

    }

    public void init(GameObject p)
    {
        for(int i=0;i<poolSize;i++)
        {
            GameObject obj = Instantiate(prefab,p.transform);
            obj.SetActive(false);
            pool.Enqueue(obj);
        }
    }

    public GameObject GetObject(Vector3 pos)
    {
        GameObject obj;

        if(pool.Count > 0)
        {
            obj = pool.Dequeue();
        }
        else
        {
            obj = Instantiate(prefab);
        }

        obj.transform.position = pos;
        obj.SetActive(true);

        return obj;
    }

    public void ReturnObject(GameObject obj)
    {
        obj.SetActive(false);
        pool.Enqueue(obj);
    }

}

 

 

Spawner 클래스 수정

using UnityEngine;

public class Spawner : MonoBehaviour
{
    [Header("Settings")]
    public float minSpawnDelay;
    public float maxSpawnDelay;

    [Header("References")]
    public GameObject[] gameObjects;

    ObjectPool[] pool;

    private void Start()
    {
    	// 미리 오브젝트풀을 생성해둔다.
        pool = new ObjectPool[gameObjects.Length];

        for(int i=0;i<gameObjects.Length;i++)
        {
            pool[i] = new ObjectPool();
            pool[i].prefab = gameObjects[i];
            pool[i].init(gameObject);
        }
    }

    // Start is called once before the first execution of Update after the MonoBehaviour is created
    void OnEnable()
    {
        Invoke("Spawn", Random.Range(minSpawnDelay,maxSpawnDelay));
    }

    private void OnDisable()
    {
        CancelInvoke();
    }

    void Spawn()
    {
    	// 아래처럼 소스 수정 
        int idx = Random.Range(0, gameObjects.Length);
        GameObject obj =  pool[idx].GetObject(transform.position);
        obj.GetComponent<Destroyer>().SetPool(pool[idx]);

        /*
        var randomObject = gameObjects[Random.Range(0, gameObjects.Length)];
        Instantiate(randomObject, transform.position, Quaternion.identity);
        */

        Invoke("Spawn", Random.Range(minSpawnDelay, maxSpawnDelay));
    }
}

 

 

아래와 같이 게임실행하면 미리 오브젝트를 만들어두고 hide시킨다.

 

 

 

 

Rider를 설치하자. (https://www.jetbrains.com/rider/)

 

 

  • 코드 리팩토링 도구를 사용하여 아래와 같이 코드 변경 

 

 

 

'Unity' 카테고리의 다른 글

블랜더  (0) 2024.12.24
2025년2월2주  (0) 2024.12.24
2025년2월1주(2/3~2/9) 무료 서버 구축하기  (0) 2024.12.24
2025년1월 2주  (0) 2024.12.24
2025년1월1주(12/30~1/5) (김치런 Game)  (0) 2024.12.24