반응형
Object Pooling은 많이 들어봤고
디자인 패턴 중에 가장 이해하기 쉬운 것이라고 생각한다.
[Game Developer, 게임개발자/디자인패턴] - Object Pool, 오브젝트 풀, 객체 풀 [디자인패턴](최적화)
더군다나 Unity 2021에서는 이제 엔진에서 지원한다.
그래서 더 좋다.
공부할 때도 유니티의 native에서 지원하는 함수들을 바탕으로 하면 될 것이다.
1. ObjectPool을 이용하는 주체
using UnityEngine;
using UnityEngine.Pool;
public class Launcher : MonoBehaviour {
[SerializeField] Bullet bulletPrefab;
private IObjectPool<Bullet> bulletPool;
private void Awake()
{
//(생성하는 함수, Get, Release, Destroy, Max)
//Pool의 크기를 3으로 유지하는 것이다. => 최종적으로는 3개만 풀에 저장함.
bulletPool = new ObjectPool<Bullet>(
CreateBullet,
OnGet,
OnRelease,
OnDestroy,
maxSize : 3
);
}
private Bullet CreateBullet()
{
Bullet bullet = Instantiate(bulletPrefab); //생성
bullet.SetPool(bulletPool); //풀 설정
return bullet;
}
//=> Get이 실행될 때 실행되는 함수 => element가 parameter가 됨
private void OnGet(Bullet bullet))
{
bullet.gameObject.SetActive(true);
}
//=> Release가 실행될 때 실행되는 함수 element가 실행함.
private void OnRelease(Bullet bullet))
{
bullet.gameObject.SetActive(false);
}
private void OnDestory(Bullet bullet))
{
Destroy(bullet.gameObject)
}
private void Update() {
if (Input.GetKeyDown(KeyCode.Space))
{
bulletPool.Get();
}
}
}
2. 대상 Object
using UnityEngine;
using UnityEngine.Pool;
public class Bullet : MonoBehaviour {
[SerializeField] Vector3 speed;
//오브젝트 자체에서 어떤 Pool에 들어가야 하는지 알고 있어야함.
private IObjectPool<Bullet> bulletPool;
//Pool의 정보는 Bullet이 반환될 때 같이 불러준다.
private SetPool(IObjectPool<Bullet> pool)
{
bulletPool = pool;
}
private void Update() {
transform.position += speed * Time.deltaTime;
}
//화면에서 사라지면 Pool로 다시 집어 넣는다.
private void OnBecameInvisible() {
bulletPool.Release(this);
}
}
최적화 중에 이것보다 쉬운 최적화는 없다고 할 수 있고 이만큼 성능이 눈에 띄게 좋아지는 것도 없다.
오브젝트 풀을 있는 것을 이용해도 좋지만
시간이 난다면 만들어보는 것도 좋다.
아니 우선 혼자 만들어보고 저거를 쓰는 것이 좋겠다.
반응형
'Game Development, 게임개발 > 개발' 카테고리의 다른 글
유니티 플레이 중 Recomplie 막는 방법 [Unity] (0) | 2022.06.12 |
---|---|
구글 애드몹, GoogleAdmob id 빌드할 때마다 사라짐 [유니티, Unity] (0) | 2022.06.12 |
Observer Pattern를 Unity에서 이용하기 (0) | 2022.06.05 |
Convert 그리고 Parse의 문화권 문제 [C#] (0) | 2022.05.22 |
RectTransform과 Transform의 이해 (0) | 2022.04.17 |