유니티로 게임을 제작하다 보면 게임이 시작되기 전에 특정 오브젝트가 씬에 로드되어 있으면 하는 순간들이 있습니. 그냥 Hierarchy창에서 미리 만들어두거나 싱글톤을 사용하는 방법도 있지만, 이 글에서는 유니티 어트리뷰트를 이용한 방법을 설명하겠습니다. 유니티는 "RuntimeInitializeOnLoadMethod" 라는 어트리뷰트를 지원하는데, 이 어트리뷰트를 가진 함수는 씬이 로드되기 전에 호출될 수 있습니다.
using UnityEngine;
public class BootStrapper
{
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
public static void CreateNeededObjectsBeforeSceneLoad()
{
CreateObject<GameManager>();
}
private static void CreateObject<T>() where T : MonoBehaviour
{
if (Object.FindObjectOfType<T>() != null)
{
return;
}
var obj = new GameObject(typeof(T).Name);
obj.AddComponent<T>();
}
}
BootStrapper클래스는 MonoBehaviour의 상속을 받을 필요도 없습니다. 다만 RuntimeInitializeOnLoadMethod 어트리뷰트를 사용하는 함수는 정적 함수이어야 합니다. RuntimeInitializeOnLoadMethod 어트리뷰트는 매개변수로 "RuntimeInitializeLoadType"를 받는데, 기본값이 "AfterSceneLoad"로 설정돼있습니다. 이 경우 Awake함수가 호출된 후에 게임 매니저 오브젝트가 생성되므로 Awake함수에서 게임 매니저를 사용하는 클래스가 있다면 문제가 될 수 있습니다. Awake함수 전에 호출되긴 원한다면 위 코드처럼 타입을 BeforeSceneLoad로 설정해주면됩니다. 이외에도 여러 가지 타입을 지원하니 아래의 링크를 참고하여 필요한 시점에 함수를 호출할 수 있습니다.
Unity - Scripting API: RuntimeInitializeLoadType
Success! Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable. Close
docs.unity3d.com
'Unity > Tip' 카테고리의 다른 글
게임을 빌드한 후 로그를 보는방법 (0) | 2023.03.11 |
---|---|
오브젝트의 중심을 얻는방법 (0) | 2023.03.11 |
World UI가 항상 오브젝트 위에 보이도록 하는방법 (0) | 2023.03.04 |
"진짜" 로딩을 만드는 방법 (0) | 2023.03.04 |
2D 게임에서 Y축을 기준으로 오브젝트를 정렬하는 방법 (0) | 2023.03.04 |