효율적인 Unity 프로젝트 구조 설계에 대해 학습하고, 정리해보았다.
특히 유지보수성과 성능, 확장성 관점에서 중요한 요소들을 중심으로 정리하였다.
Enum과 Struct는 하나의 파일에서 모아서 관리하는 것이 유지보수에 효과적
public static readonly 또는 const를 활용하여 불변값만 전역 관리DontDestroyOnLoad(this.gameObject)로 씬 전환에도 유지남용 시 결합도 증가와 디버깅 난이도 상승
using UnityEngine;
public class Singleton<T> : MonoBehaviour where T : MonoBehaviour
{
private static T instance;
public static T Instance
{
get
{
if (instance == null)
{
// 해당 컴포넌트를 가지고 있는 게임 오브젝트 반환
instance = (T)FindAnyObjectByType(typeof(T));
if (instance == null)
{
// 새로운 게임 오브젝트 생성 및 컴포넌트 추가
GameObject obj = new GameObject(typeof(T).Name, typeof(T));
// 새로운 오브젝트의 컴포넌트 인스턴스에 지정
instance = obj.GetComponent<T>();
}
}
return instance;
}
}
protected virtual void Awake()
{
// 인스턴스가 없을 때 해당 오브젝트로 설정
if (instance == null)
{
instance = this as T;
DontDestroyOnLoad(this.gameObject);
}
// 인스턴스가 존재한다면 현재 오브젝트 파괴
else if (instance != null)
Destroy(gameObject);
}
}
ScriptableObject를 하나의 큰 묶음으로 관리StageDataList, ItemDatabase 등메모리 절약을 위해 불필요한 데이터까지 함께 로드하지 않도록 설계
ScriptableObject나 Dictionary 등으로 묶어 중앙 집중식 관리Pool로 관리하여 GC 호출 방지 및 성능 최적화Canvas 분리EventTrigger보다 UnityEvent, AddListener 사용 권장
이번 정리를 통해 프로젝트 구조의 중요성을 다시금 깨달았다. 더 체계적으로 설계하고, 유지보수성과 확장성을 고려한 개발 습관을 만들어나가는 방향으로 공부해야겠다.