다음 사이트를 참조하였습니다.
http://www.youtube.com/watch?v=IX041ZvgQKE&feature=related
동영상에 나오는 소스 코드를 정리한 것입니다.
상세한 설명은 동영상을 참조하세요.
using UnityEngine;
// using System; <- 이것이 있으면 object vs Object가 헷갈려합니다. (Java와 UnityEngine사이에서 혼동)
using System.Collections;
using System.Collections.Generic;
using System.Linq;
public class ObjectRecycler
{
public delegate void ObjectRecyclerChangedEventHandler(int available, int total);
public event ObjectRecyclerChangedEventHandler onObjectRecylerChanged;
private List<GameObject> objectList;
private GameObject objectToRecycle;
public ObjectRecycler (GameObject obj, int totalObjectsAtStart)
{
objectList = new List<GameObject>(totalObjectsAtStart);
objectToRecycle = obj;
for (int i = 0; i < totalObjectsAtStart; i++) {
GameObject newObject = Object.Instantiate(obj) as GameObject;
newObject.gameObject.active = false;
objectList.Add(newObject);
}
}
private void InfoChangedEvent() {
if (onObjectRecylerChanged != null) {
// using System; <- 이것이 있으면 object vs Object가 헷갈려합니다. (Java와 UnityEngine사이에서 혼동)
using System.Collections;
using System.Collections.Generic;
using System.Linq;
public class ObjectRecycler
{
public delegate void ObjectRecyclerChangedEventHandler(int available, int total);
public event ObjectRecyclerChangedEventHandler onObjectRecylerChanged;
private List<GameObject> objectList;
private GameObject objectToRecycle;
public ObjectRecycler (GameObject obj, int totalObjectsAtStart)
{
objectList = new List<GameObject>(totalObjectsAtStart);
objectToRecycle = obj;
for (int i = 0; i < totalObjectsAtStart; i++) {
GameObject newObject = Object.Instantiate(obj) as GameObject;
newObject.gameObject.active = false;
objectList.Add(newObject);
}
}
private void InfoChangedEvent() {
if (onObjectRecylerChanged != null) {
var allFree = from item in objectList
where item.active == false
select item;
onObjectRecylerChanged(allFree.Count(), objectList.Count);
}
}
public GameObject NextFree{
get {
var freeObject = ( from item in objectList
where item.active == false
select item).FirstOrDefault();
if (freeObject == null) {
freeObject = Object.Instantiate( objectToRecycle ) as GameObject;
objectList.Add(freeObject);
}
freeObject.active = true;
InfoChangedEvent();
return freeObject;
}
}
public void FreeObject(GameObject objectTorFree) {
objectTorFree.gameObject.active = false;
select item;
onObjectRecylerChanged(allFree.Count(), objectList.Count);
}
}
public GameObject NextFree{
get {
var freeObject = ( from item in objectList
where item.active == false
select item).FirstOrDefault();
if (freeObject == null) {
freeObject = Object.Instantiate( objectToRecycle ) as GameObject;
objectList.Add(freeObject);
}
freeObject.active = true;
InfoChangedEvent();
return freeObject;
}
}
public void FreeObject(GameObject objectTorFree) {
objectTorFree.gameObject.active = false;
InfoChangedEvent();
}
}
}
}
