본문 바로가기
유니티 & C#

유니티 - 씬 이름을 Enum 으로 관리하기 [InitializeOnLoadMethod] 사용

by 17번 일개미 2023. 10. 26.
728x90

유니티에서 빌드 세팅에 추가된 씬들을 Enum 으로 관리하고 싶다는 Needs 가 생겼다.

 

유니티에서는 씬에 접근할 때, 씬의 이름 string 이나, 씬의 BuildIndex int 로 접근하는데,

해당 방식이 코드 상에서 명확하지 않다는 점이 존재한다.

그렇다고 씬이 많아지면 일일히 빌드 인덱스에 대치되는 Enum을 손수 작성하기는 귀찮다.

 

따라서, 씬을 빌드 세팅에 추가하면, 자동으로 Enum Class 를 생성해주는 스크립트를 작성해보았다.

 

필요한 분이 계시다면 도움이 되었으면 합니다.

 

using System.Collections.Generic;
using System.IO;
using UnityEditor;

public class SceneNameEnumCreator
{
	[InitializeOnLoadMethod]
	public static void RegisterSceneListChangedCallback()
	{
		EditorBuildSettings.sceneListChanged -= CreateEnum;
		EditorBuildSettings.sceneListChanged += CreateEnum;
	}
	[MenuItem("Tools/Create scene enum file")]
	public static void CreateEnum()
	{
		EditorBuildSettingsScene[] sceneList = EditorBuildSettings.scenes;

		if (sceneList.Length == 0) return;

		if (Directory.Exists("Assets/Scripts/AutoCreated/Enum/") == false)
		{
			Directory.CreateDirectory("Assets/Scripts/AutoCreated/Enum/");
		}
		List<string> sceneNameList = new List<string>();
		foreach (var scene in sceneList)
		{
			string[] paths = scene.path.Split('/');
			sceneNameList.Add(paths[paths.Length - 1].Split('.')[0]);
		}

		StreamWriter sw = new StreamWriter("Assets/Scripts/AutoCreated/Enum/ESceneName.cs");

		sw.WriteLine("// This enum is auto created by SceneNameEnumCreator.cs");
		sw.WriteLine();
		sw.WriteLine("public enum ESceneName");
		sw.WriteLine('{');
		foreach (var sceneName in sceneNameList)
		{
			sw.WriteLine($"\t{sceneName},");
		}
		sw.WriteLine("}");
		sw.Close();
		UnityEngine.Debug.Log("Successfully created scene enum file.");
	}
}

 

 

여기서 [InitializeOnLoadMethod] Attribute 가 지정된 함수는 에디터 갱신 시 마다 호출되며,

이 시점에 Enum 을 생성한다.

728x90