[Unity] | 씬 전환을 편하게 해보자!

a-a·2024년 9월 6일

알쓸신잡

목록 보기
4/26

참고 블로그 : 진우의 혼잣말하는 블로그

개요


항상 씬 폴더를 찾기 귀찮았는데, 진우 형에게 좋은 것을 알게 되었다가 이번 프로젝트에 적용해 보기로 했다.

Import 및 사용 방법


1. 패키지 링크 가져오기


깃헙 링크에 들어가서 깃 링크를 복사한다.

2. 패키지에 넣기


3. 코드 수정하기


해당 스크립트의 경로는 "...\Toolbar Extender\1.4.2\Scene switcher buttons\Editor"이다.
본인의 스타일에 맞게 수정을 하면 되겠다.
맨 윗단의 블로그를 참고해서, 버튼 크기만 동적으로 바뀌도록 만들어 주었다.

using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;

namespace UnityToolbarExtender.Examples
{
	static class ToolbarStyles
	{
		public static readonly GUIStyle commandButtonStyle;

		static ToolbarStyles()
		{
			commandButtonStyle = new GUIStyle("Command")
			{
				fontSize = 16,
				alignment = TextAnchor.MiddleCenter,
				imagePosition = ImagePosition.ImageAbove,
				fontStyle = FontStyle.Bold
			};
		}
	}

	[InitializeOnLoad]
	public class SceneSwitchLeftButton
	{
		static SceneSwitchLeftButton()
		{
			ToolbarExtender.LeftToolbarGUI.Add(OnToolbarGUI);
		}

		static void CreateButton(string text, string sceneName)
		{
            GUIContent buttonContent = new GUIContent(text);
            Vector2 buttonSize = GUI.skin.button.CalcSize(buttonContent);
            if (GUILayout.Button(buttonContent, GUILayout.Width(buttonSize.x), GUILayout.Height(buttonSize.y)))
            {
                SceneHelper.OpenScene(sceneName);
            }
        }
		static void OnToolbarGUI()
		{
            GUILayout.FlexibleSpace();

			string[] bntText = { "AwakeScene", "LobbyScene", "TutorialScene", "MainGameScene" };
			for (int i = 0; i < bntText.Length; i++)
				CreateButton(bntText[i], bntText[i]);
		}
	}

	static class SceneHelper
	{
		static string sceneToOpen;

		public static void OpenScene(string sceneName)
		{
            var saved = EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo();
            if (saved)
            {
                _ = EditorSceneManager.OpenScene($"Assets/Scenes/{sceneName}.unity");
            }
        }

		static void OnUpdate()
		{
			if (sceneToOpen == null ||
			    EditorApplication.isPlaying || EditorApplication.isPaused ||
			    EditorApplication.isCompiling || EditorApplication.isPlayingOrWillChangePlaymode)
			{
				return;
			}

			EditorApplication.update -= OnUpdate;

			if(EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo())
			{
				string[] guids = AssetDatabase.FindAssets("t:scene " + sceneToOpen, null);
				if (guids.Length == 0)
				{
					Debug.LogWarning("Couldn't find scene file");
				}
				else
				{
					string scenePath = AssetDatabase.GUIDToAssetPath(guids[0]);
					EditorSceneManager.OpenScene(scenePath);
					EditorApplication.isPlaying = true;
				}
			}
			sceneToOpen = null;
		}
	}
}
profile
"게임 개발자가 되고 싶어요."를 이뤄버린 주니어 0년차

0개의 댓글