Unity3D_MMO - PoolManager (2)

k_hyun·2022년 10월 16일
0

Unity_MMO_Project

목록 보기
18/33

ResourceManager.cs

public T Load<T>(string path) where T : Object
    {
        if (typeof(T) == typeof(GameObject))
        {
            string name = path;
            int index = name.LastIndexOf('/');
            if (index >= 0)
                name = name.Substring(index + 1);

            GameObject go = Managers.Pool.GetOriginal(name);
            if (go != null)
                return go as T;
        }

        return Resources.Load<T>(path);        
    }

GameObject를 Load하는 경우 Pool매니저의 GetOriginal 함수를 사용하여 go에 접근한다.

만약 풀링한 go가 있을 경우 해당 go를 반환한다.

public GameObject Instantiate(string path, Transform parent = null)
    {
        GameObject original = Load<GameObject>($"Prefabs/{path}");
        if (original == null)
        {
            Debug.Log($"Failed to load prefab : {path}");
            return null;
        }

        if (original.GetComponent<Poolable>() != null)
            return Managers.Pool.Pop(original, parent).gameObject;

        GameObject go =  Object.Instantiate(original, parent);
        go.name = original.name;
        return go;
    }

original이 Poolable 컴포넌트가 있는 경우 PoolManager에서 Pop함수를 통해 루트에 존재하는 go를 instantiate 한다.

public void Destroy(GameObject go)
    {
        if (go == null)
            return;

        Poolable poolable = go.GetComponent<Poolable>();
        if (poolable != null)
        {
            Managers.Pool.Push(poolable);
            return;
        }
        Object.Destroy(go);
    }

gameObject가 Poolable 컴포넌트가 있으면 PoolManager에서 Push함수를 써서 루트 산하로 넣는다.

그렇지 않은 경우 기존 방식과 마찬가지로 go를 Destroy한다.

실행 결과


[LoginScene]

5개의 UnityChan Prefab을 Instantiate하고 바로 Destroy 하였다.

UnityChan은 Poolable이 부착되어있는데, 이 때문에 UnityChan_Root로 이동한다.


[GameScene]

5개의 UnityChan을 Instantiate하였다.

기존에 있는 1개를 포함하여 총 6개의 UnityChan이 생성됨을 확인하였다.

DontDestroyOnLoad에 UnityChan_Root가 생성됨을 확인하였다.

0개의 댓글