Unity 개체 풀 패키지

3865 단어
모두 두 가지 클래스로 나뉘는데 SubPool과 ObjectPool, SubPool 클래스는 전체 대상 탱크에 ObjectPool의 하위 탱크를 포함하고 ObjectPool은 탱크에 들어갈 대상을 포함한다.
호출 방법:
4
  • 풀에 포함: ObjectPool.Instance.Spawn()

  • 4
  • 풀 아웃: ObjectPool.Instance.UnSpawn()

  • 4
  • 풀 전체: ObjectPool.Instance.UnSpawnAll()

  • 4
  • 풀 폐기: ObjectPool.Instance.DisPool();

  • SubPool 클래스(단일 상위 클래스로 상속)
    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    
    public class SubPool
    {
        List Pool=new List();
    
        /// 
        ///  
        /// 
        public GameObject Spawn(string obj)
        {
                foreach (GameObject item in Pool)
                {
                    if (!item.activeSelf)
                    {
                        item.SetActive(true);
                        item.SendMessage("Spawn",SendMessageOptions.DontRequireReceiver);
                        return item;
                    }
                }
            GameObject go = CreateObj(obj);
            Pool.Add(go);
           go.SendMessage("Spawn",SendMessageOptions.DontRequireReceiver);
            return go;
        }
    
    /// 
    ///  
    /// 
    /// 
     public void UnSpawn(GameObject go=null,string goname="")
        {
            if (go!=null)
            {
                go.SetActive(false);
            }
            else
            {
                for (int i = 0; i < Pool.Count; i++)
                {
                    if (Pool[i].activeSelf)
                    {
                        Pool[i].SetActive(false);
                        return;
                    }
                }
            }
        }
    
    /// 
    ///  
    /// 
    public void UnSpawnAll()
        {
            foreach (GameObject item in Pool)
            {
                item.SetActive(false);
            }
        }
    
        /// 
        ///  
        /// 
        GameObject CreateObj(string obj)
        {
            GameObject go = GameObject.Instantiate(Resources.Load("Prefabs/Others/"+obj) as GameObject);
            go.transform.SetParent(GameObject.Find("Pool").transform, false);
            go.name = go.name.Replace("(Clone)", "");
            return go;
        }
    }
    
    

    ObjectPool 클래스
    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    using Framework;
    
    public class ObjectPool:Manager
    {
        ObjectPool()
        {
        }
    
        Dictionary pools= new Dictionary();
        
        /// 
        ///  
        /// 
        ///  
        public GameObject Spawn(string obj)
        {
                if (pools.ContainsKey(obj))
                {
                    return pools[obj].Spawn(obj);
                }
                else
                {
                    SubPool sp = new SubPool();
                   var go = sp.Spawn(obj);
                    pools.Add(obj, sp);
                    return go;
                }
            return null;
        }
    
        /// 
        ///  
        /// 
        ///  
        public void UnSpawn(GameObject go=null,string goName="")
        {
            if (!go)
            {
                if (pools.ContainsKey(goName))
                {
                    pools[goName].UnSpawn(null,goName);
                }
            }
            else
            {
                if (pools.ContainsKey(go.name))
                {
                    pools[go.name].UnSpawn(go);
                }
            }
    
        }
    
        /// 
        ///  
        /// 
        ///  
        public void UnSpawnAll(string pool)
        {
            if (pools.ContainsKey(pool))
            {
                pools[pool].UnSpawnAll();
            }
        }
    
        /// 
        ///  
        /// 
        ///  
        public void DisPool(string pool)
        {
            if (pools.ContainsKey(pool))
            {
                pools.Remove(pool);
            }
        }
    
    
    }
    
    

    좋은 웹페이지 즐겨찾기