본문 바로가기

Unity/Unity 스파르타

6주차 - Object Pool 예제 ( + Animator.StringToHash() )

728x90

목차

1. Object Pool 예제

2. Animator.StringToHash()

 

1. Object Pool 예제

Object Pool? 

더보기

프로그래밍에서 리소스를 효율적으로 관리하기 위해 사용되는 디자인 패턴입니다. Object Pool 은 미리 생성된 객체들을 보관하고 필요할 때 재사용함으로써 객체 생성과 소멸의 오버헤드를 줄이고 성능을 향상시킵니다.

 

1. 스크립트 작성

이름, 프리펩, 사이즈를 가지고있는 구조체를 생성하고

구조체를 가지고있는 리스트 생성합니다

[System.Serializable]
    public struct Pool
    {
        public string tag;
        public GameObject prefeb;
        public int size;
    }
    public List<Pool> pools;
    public Dictionary<string, Queue<GameObject>> poolDict;

딕셔너리를 이용해 구조체의 이름으로 접근해 프리팹을 가지고 올것입니다.

private void Awake()
    {
        poolDict = new Dictionary<string, Queue<GameObject>>();
        foreach(Pool pool in pools)
        {
            Queue<GameObject> queue = new Queue<GameObject>();
            for (int i = 0; i < pool.size; i++)
            {
                GameObject obj = Instantiate(pool.prefeb);
                obj.SetActive(false);
                queue.Enqueue(obj);
            }
            poolDict.Add(pool.tag, queue);
        }
    }

미리 오브젝트들을 생성해 놓습니다.

 

태그를 사용해 미리 저장된 오브젝트를 가져오는 함수를 만듭니다

 public GameObject SpawnFromPool(string tag)
    {
        if (!poolDict.ContainsKey(tag))
        {
            return null;
        }
        GameObject obj = poolDict[tag].Dequeue();
        poolDict[tag].Enqueue(obj);

        return obj;
    }

 

위 오브젝트를 재활용해서 쓸때, 오브젝트를 모두 비활성화 해놨기 때문에 위치를 재설정한뒤에 활성화 시켜주면 계속해서 새로운 오브젝트를 만드는게 아닌 오브젝트 풀에 미리 만들어놓은 오브젝트를 계속 재활용할 수 있게됩니다.

만들어진 오브젝트를 없앨때는 Destroy로 없애는게 아니라 비활성화만 시켜놓으면 됩니다.

 

2. Animator.StringToHash()

//읽기 전용 
static readonly int IsWalking = Animator.StringToHash("IsWalking");

Animator 컴포넌트를 사용하여 애니메이션을 제어할 때, 특정 매개변수를 사용하기 위해 문자열을 해시값으로 변환하는 코드입니다.

Unity에서 애니메이션을 제어할 때, Animator 컴포넌트에는 애니메이션 매개변수(Parameters)라는 것이 있는데 이러한 매개변수는 애니메이션 상태를 제어하거나 조건에 따라 애니메이션을 전환하는 데 사용됩니다.

문자열을 사용하여 애니메이션 매개변수를 제어할 수도 있지만, 매번 문자열을 비교하는 것은 성능상의 이슈가 발생할 수 있습니다. 따라서 문자열 대신 정수를 비교하여 애니메이션 매개변수를 제어하므로 성능상의 이점을 얻을 수 있습니다.

728x90