2024. 1. 30. 22:04, Unity
GameManager 혹은 GameBoard 클래스 등에서
public void InitializeObjectPools()
{
foreach (var pool in fruitPool.GetComponentsInChildren<ObjectPool>())
pool.Initialize();
}
등과 같이 작성해서 기본적으로 fruitPool (이 경우 FruitPool 스크립트가 부착된 오브젝트) 의 자식들에서 ObjectPool 을 컴포넌트로 가지고 있는 컴포넌트들을 초기화 하는 과정.
이때의 로직을 따라 가보면, ObjectPool 클래스 내에서,
Initialize() 메서드 로직
public void Initialize()
{
for (var i = 0; i < initialSize; i++)
{
var obj = CreateInstance();
obj.SetActive(false);
instances.Push(obj);
}
}
CreateInstance() 메서드 로직
private GameObject CreateInstance()
{
var obj = Instantiate(prefab);
var pooledObject = obj.AddComponent<PooledObject>();
pooledObject.pool = this;
obj.transform.SetParent(transform);
return obj;
}
이와 같은 형태로 진행된다.
결국 위와 같은 과정을 거쳐서 오브젝트 풀에 처음 원하는 값으로 설정한 갯수만큼 프리펩을 통해 오브젝트를 만들고 해당 오브젝트들을 SetActive(false) 로 만든뒤에 instances 스택에 Push 해놓는다.
이제 이렇게 초기화 해놓은 것들을 원하는 위치로 가져왔다가 불필요해질 경우에는 다시
RetrunObject() 메서드로 Pool 로 되돌려 놓으면 된다.
이때에 ObjectPool 에 작성된 RetrunObejct() 코드를 첨부하자면,
ReturnObejct()
public void ReturnObject(GameObject obj)
{
var pooledObject = obj.GetComponent<PooledObject>();
Assert.IsNotNull(pooledObject);
Assert.IsTrue(pooledObject.pool == this);
obj.SetActive(false);
if (!instances.Contains(obj))
{
instances.Push(obj);
}
}
이와 같다.
이때에 PooledObject의 경우는 ObjectPool 클래스 파일에 함께 작성해놓은 Utility class이다
구조는
public class PooledObject : MonoBehaviour
{
public ObjectPool pool;
}
이와 같다.
'Unity' 카테고리의 다른 글
Animated Button 클래스를 구현할때 [Serializable] 의 사용 유무에 따른 유니티 인스펙터에서의 차이점. (0) | 2024.02.06 |
---|---|
오브젝트 풀에서 개체를 가져와서 특정 오브젝트의 자식들로 모아놓은뒤에, 다시 원래의 오브젝트 풀의 자식으로 옮기는 방법과 해당 방법을 구현하는 과정에서의 시행착오. (0) | 2024.02.03 |
유니티 오브젝트의 GetInstanceID() 함수를 이용한, 두 충돌 물체에서 한쪽에서만 원하는 로직이 실행되도록 만드는 방법. (0) | 2024.01.30 |
Collider2D 설정시에 기본 Friction 과 Bounciness에 대하여 (0) | 2024.01.23 |
TextMeshPro 와 TextMeshProUGUI 에 대해서 (0) | 2024.01.22 |
Comments, Trackbacks