| UI제작시 프리팹화 해야하는 이유
씬에 프리팹을 쓰지않고 UI를 미리 올려두면 발생할 수 있는 문제
=> 풀링없이 필요할 때 SetActive(true), 사용하지 않을 때 SetActive(false)하는 방법
1.. 협업 시 충돌이 날 수 있다.
=> 프리팹을 이용하지않고 처음부터 모든 UI를 띄워놓는 방식이라면, 하이어라키 창에서 관리를 하게 될텐데, 누군가 다른 UI를 수정했는데, 씬파일이 수정 되었기 때문에 충돌날 가능성이 매우 높다. 따라서 프리팹을 이용해 관리해야한다.
| 인스턴스화 된 UI 반복사용
반복적으로 사용되는 UI가 있으면, 같은 프리팹을 인스턴스화 -> destroy하면 가비지가 쌓여 문제가 발생할 수 있다. 고정적이고 크기가 작은 UI라면 크게 상관이 없겠지만, DB를 불러와 표시할 데이터가 많아지면 점점 문제가 생길 수 있다. 따라서 풀링 시스템을 이용해, 반복 사용이 많은 프리팹들을 재사용하자.
| 풀링 시스템 이용 실습 (다중 풀링 시스템)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class UiPool : MonoBehaviour
{
public static UiPool instance = null;
[SerializeField] GameObject[] UiObject;
private Dictionary<string, GameObject> poolingObject = new Dictionary<string, GameObject>();
void Awake()
{
if(instance == null)
{
instance = this;
DontDestroyOnLoad(gameObject);
}
else
{
if(instance != this)
{
Destroy(this.gameObject);
}
}
Initialize();
}
private void Initialize()
{
for(int i = 0; i < UiObject.Length; i++)
{
var obj = Instantiate(UiObject[i]);
obj.SetActive(false);
obj.transform.SetParent(transform);
poolingObject.Add(UiObject[i].name, obj); //key는 오브젝트이름, value는 오브젝트
}
}
public static GameObject GetObject(string UiName)
{
if(instance.poolingObject.ContainsKey(UiName))
{
var obj = instance.poolingObject[UiName];
instance.poolingObject.Remove(UiName);
obj.transform.SetParent(GameObject.Find("Canvas").transform);
obj.SetActive(true);
return obj;
}
else
{
Debug.LogError("없는 Ui입니다. 인스턴스화 할 오브젝트의 이름을 다시 확인해주세요.");
return null;
}
}
public static void ReturnObject(GameObject obj)
{
obj.gameObject.SetActive(false);
obj.transform.SetParent(instance.transform);
if(!instance.poolingObject.ContainsKey(obj.name.Substring(0, obj.name.Length - 7))) //Substring은 name 뒤에 붙은 (Clone)제거
{
instance.poolingObject.Add(obj.name.Substring(0, obj.name.Length - 7), obj);
}
else
{
Debug.LogError("이미 존재하는 key값 입니다.");
}
}
}
필요한 Ui를 모두 풀링에 넣어두고 사용하는 기법이다. Ui프리팹마다 컴포넌트가 다르므로, 풀에 넣을 데이터 타입을GameObject로 두었다. 풀에서 하나씩 꺼내 이용할 때, 아무거나 사용이 아닌 필요한 것을 탐색하기 때문에 Dictionary를 이용하였다.
풀링 시스템과 메모리 개념
https://glikmakesworld.tistory.com/13
오브젝트 풀링 - 유니티로 공부하는 게임 제작기술 (Object Pooling)
오브젝트 풀링 기법은 유니티 게임 프로그래밍을 배울 때 가장 먼저 배우는 기법들 중 하나일 것이다. 일단 오브젝트 풀링이 왜 필요하고 정체가 무엇인지 예시를 들어 설명하겠다. Strikers 1945
glikmakesworld.tistory.com
기초 풀링 실습
https://wergia.tistory.com/203
[Unity3D] Programming - 오브젝트 풀링 기법 구현하기
Programming - 오브젝트 풀링 기법 작성 기준 버전 :: 2019.2 프로그래밍에서 오브젝트를 생성하거나 파괴하는 작업은 꽤나 무거운 작업으로 분류된다. 오브젝트 생성은 메모리를 새로 할당하고 리소
wergia.tistory.com
'C#_ Unity Game programming' 카테고리의 다른 글
Unity - this(컴포넌트)와 gameObject의 차이 (1) | 2024.01.15 |
---|---|
Unity-Instantiate할 때 Canvas의 자식으로 넣는법 (1) | 2024.01.13 |
유니티 C#, 인터페이스를 활용한 성능 향상 실습 (0) | 2024.01.06 |
Unity, MVC와 MVP패턴의 차이점 및 실습 코드 (0) | 2024.01.05 |
Unity, Scriptable Object개념 (1) | 2024.01.04 |