728x90
반응형
유니티 오브젝트 풀링이란?
게임을 개발하다 보면, 자주 생성되고 삭제되는 게임 오브젝트들이 있다.
특히 총알, 파티클, 적 캐릭터 등과 같이 매우 빈번하게 생성되고 소멸되는 오브젝트들은 메모리 관리에 있어서 중요한 문제를 일으킬 수 있는데...
각 오브젝트가 생성될 때마다 메모리 할당과 삭제가 발생하면 메모리 사용량이 증가하고, 게임의 성능에 부정적인 영향을 미칠 수 있다.
이러한 문제를 해결하기 위해 객체 풀링(Object Pooling) 기법을 사용할 수 있다.
객체 풀링은 미리 생성된 객체들을 풀에 저장해두고, 필요할 때마다 풀에서 객체를 가져와 재사용하는 방식이다.
Unity 2020.1 버전부터 도입되었다고 하는데 사용을 해보자!
1. 풀링을 사용할 객체를 관리하는 객체 스크립트 (ex. 총)
using System.Collections;
using UnityEngine;
using UnityEngine.Pool;
public class SkillLauncher : MonoBehaviour
{
[SerializeField] private SkillBase skillPrefab;
private ObjectPool<SkillBase> skillPool;
private Transform skillContainer;
void Start()
{
skillContainer = new GameObject("SkillContainer").transform;
skillPool = new ObjectPool<SkillBase>(
createFunc: CreateSkill,
actionOnGet: GetSkill,
actionOnRelease: ReleaseSkill,
actionOnDestroy: DestroySkill,
collectionCheck: false,
defaultCapacity: 10,
maxSize: 20
);
StartCoroutine(UseSkillCoroutine());
}
#region Pool Func
private SkillBase CreateSkill()
{
var instantiatedSkill = Instantiate(skillPrefab, skillContainer);
instantiatedSkill.Init(skillPool);
return instantiatedSkill;
}
private void GetSkill(SkillBase skillBase)
{
skillBase.gameObject.SetActive(true);
}
private void ReleaseSkill(SkillBase skillBase)
{
skillBase.gameObject.SetActive(false);
}
private void DestroySkill(SkillBase skillBase)
{
Destroy(skillBase.gameObject);
}
#endregion Pool Func
private IEnumerator UseSkillCoroutine()
{
while (true)
{
UseSkill();
yield return new WaitForSeconds(0.5f);
}
}
public void UseSkill()
{
var skill = skillPool.Get();
skill.UseSkill(this.transform.position);
}
}
2. 풀링이 되는 객체 (ex.총알)
using System.Collections;
using UnityEngine;
using UnityEngine.Pool;
public class SkillBase : MonoBehaviour
{
public float Speed = 10f;
public Vector2 Direction;
private ObjectPool<SkillBase> pool;
public void Init(ObjectPool<SkillBase> pool)
{
this.pool = pool;
}
public void UseSkill(Vector2 initPosition)
{
this.transform.position = initPosition;
Direction = UnityEngine.Random.insideUnitCircle.normalized;
StartCoroutine(ReleaseCoroutine());
}
void Update()
{
transform.Translate(Direction * Speed * Time.deltaTime);
}
private IEnumerator ReleaseCoroutine()
{
yield return new WaitForSeconds(3f);
pool.Release(this);
}
}
0.5초마다 총알을 쏘지만 최대 총알의 개수는 필요한 만큼만 생성되고,
생성된 객체들만 사용하게 된다.
최대 6개만 생성하고 더 이상 생성 하지 않고 사용하는 중이다.
728x90
반응형
'Unity' 카테고리의 다른 글
씬 변경을 해도 파괴되지 않는 오브젝트 만들기 (0) | 2024.06.10 |
---|---|
Recorder 동영상 찍기 (0) | 2024.06.09 |
MacOS VS Code 컴퓨터에 설치된 NET SDK가 없습니다 해결 방법 (0) | 2024.06.07 |
Unity Script Template 수정하기 (0) | 2024.06.04 |
Unity Input System과 Input Action 사용법 (0) | 2024.06.03 |