/// <summary> /// 오브젝트 풀로 되돌리거나 풀링되지 않은 오브젝트 삭제 /// </summary> /// <param name="obj"></param> public void Return(GameObject obj) { PoolingObject po = obj.GetComponent <PoolingObject>(); if (po != null) { // 풀링된 오브젝트 처리 obj.transform.SetParent(this.poolObjectRoot[po.path].transform); obj.gameObject.SetActive(false); } else { // 풀링 안된 오브젝트 처리 Destroy(obj); } }
/// <summary> /// 풀을 준비함. /// </summary> private void ReadyPool(string path, int count, bool autoCollecting) { // 중복처리 if (this.poolObjectRoot.ContainsKey(path)) { KLog.LogWarning(string.Format("풀링 중복: {0}", path)); return; } // 리소스정보 불러오기 GameObject resource = Resources.Load <GameObject>(path); if (resource == null) { KLog.LogError("리소스 정보를 찾지 못함. " + path); return; } // 리소스 정보 캐싱 this.objectResource.Add(path, resource); // 생성된 오브젝트들을 담을 빈 부모 오브젝트 생성 GameObject rootObj = new GameObject(path); rootObj.transform.SetParent(this.transform); this.poolObjectRoot.Add(path, rootObj); // 컨테이너에 등록 // 오브젝트를 count에 맞춰 생성 for (int i = 0; i < count; i++) { GameObject newObj = Instantiate(resource); PoolingObject po = newObj.AddComponent <PoolingObject>(); po.path = path; po.autoCollection = autoCollecting; newObj.transform.SetParent(rootObj.transform); newObj.gameObject.SetActive(false); } //KLog.Log(string.Format("Pooling Resource. Path: {0}, Count: {1}", path, count)); }
/// <summary> /// 오브젝트를 가져옴. /// 풀링된 오브젝트: 풀링된 오브젝트중 하나를 줌. 없으면 추가생성 /// 풀링안된 오브젝트: 매번 Resources.Load를 통해 가져옴 /// </summary> public T Get <T>(string path) where T : Component { if (this.poolObjectRoot.ContainsKey(path)) { // 풀링이 되어 있는 오브젝트 GameObject parentObj = this.poolObjectRoot[path]; if (parentObj.transform.childCount > 0) // 풀링이 된 오브젝트가 남아있다. { Transform ret = parentObj.transform.GetChild(0); ret.transform.SetParent(null); ret.gameObject.SetActive(true); return(ret.GetComponent <T>()); } else // 풀링된 오브젝트가 없다. { // 새로 생성 GameObject newObj = Instantiate(this.objectResource[path]); PoolingObject po = newObj.AddComponent <PoolingObject>(); po.path = path; po.autoCollection = false; KLog.LogWarning("Inc Object. " + path); return(newObj.GetComponent <T>()); } } else { // 풀링이 안된 오브젝트는 바로 생성함 KLog.LogWarning("Resource.Load Object. " + path); return(Instantiate(Resources.Load <T>(path))); } }