From 96fea7e50a22c8281d4b084e5895d9e356f8fce8 Mon Sep 17 00:00:00 2001 From: Kokyung Byun Date: Fri, 3 Nov 2023 00:21:01 +0900 Subject: [PATCH] Data Upload --- .gitignore | 3 + Assets/Editor.meta | 8 + Assets/Editor/EditorDraw.cs | 18 ++ Assets/Editor/EditorDraw.cs.meta | 11 ++ Assets/Editor/SceneLoader.cs | 18 ++ Assets/Editor/SceneLoader.cs.meta | 11 ++ Assets/Editor/SceneLoaderData.cs | 104 +++++++++++ Assets/Editor/SceneLoaderData.cs.meta | 11 ++ Assets/Editor/SceneLoaderWindow.cs | 173 ++++++++++++++++++ Assets/Editor/SceneLoaderWindow.cs.meta | 11 ++ Assets/Resources.meta | 8 + Assets/Resources/SceneLoader.meta | 8 + .../SceneLoader/SceneLoaderData.asset | 19 ++ .../SceneLoader/SceneLoaderData.asset.meta | 8 + 14 files changed, 411 insertions(+) create mode 100644 Assets/Editor.meta create mode 100644 Assets/Editor/EditorDraw.cs create mode 100644 Assets/Editor/EditorDraw.cs.meta create mode 100644 Assets/Editor/SceneLoader.cs create mode 100644 Assets/Editor/SceneLoader.cs.meta create mode 100644 Assets/Editor/SceneLoaderData.cs create mode 100644 Assets/Editor/SceneLoaderData.cs.meta create mode 100644 Assets/Editor/SceneLoaderWindow.cs create mode 100644 Assets/Editor/SceneLoaderWindow.cs.meta create mode 100644 Assets/Resources.meta create mode 100644 Assets/Resources/SceneLoader.meta create mode 100644 Assets/Resources/SceneLoader/SceneLoaderData.asset create mode 100644 Assets/Resources/SceneLoader/SceneLoaderData.asset.meta diff --git a/.gitignore b/.gitignore index 58cbc82..9572b05 100644 --- a/.gitignore +++ b/.gitignore @@ -70,3 +70,6 @@ crashlytics-build.properties # Temporary auto-generated Android Assets /[Aa]ssets/[Ss]treamingAssets/aa.meta /[Aa]ssets/[Ss]treamingAssets/aa/* + +# Mac Relative +.DS_Store diff --git a/Assets/Editor.meta b/Assets/Editor.meta new file mode 100644 index 0000000..7b7a534 --- /dev/null +++ b/Assets/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 768a1503ba181424d8f984ae90de6fd6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/EditorDraw.cs b/Assets/Editor/EditorDraw.cs new file mode 100644 index 0000000..eb3a656 --- /dev/null +++ b/Assets/Editor/EditorDraw.cs @@ -0,0 +1,18 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class EditorDraw : MonoBehaviour +{ + // Start is called before the first frame update + void Start() + { + + } + + // Update is called once per frame + void Update() + { + + } +} diff --git a/Assets/Editor/EditorDraw.cs.meta b/Assets/Editor/EditorDraw.cs.meta new file mode 100644 index 0000000..e987bd3 --- /dev/null +++ b/Assets/Editor/EditorDraw.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 75a85d4198b1c45d390c69cd0dd77aa2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/SceneLoader.cs b/Assets/Editor/SceneLoader.cs new file mode 100644 index 0000000..cb5e207 --- /dev/null +++ b/Assets/Editor/SceneLoader.cs @@ -0,0 +1,18 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class SceneLoader : MonoBehaviour +{ + // Start is called before the first frame update + void Start() + { + + } + + // Update is called once per frame + void Update() + { + + } +} diff --git a/Assets/Editor/SceneLoader.cs.meta b/Assets/Editor/SceneLoader.cs.meta new file mode 100644 index 0000000..bd988ce --- /dev/null +++ b/Assets/Editor/SceneLoader.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3d56546fb9bda4c1e894352f7d3aff86 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/SceneLoaderData.cs b/Assets/Editor/SceneLoaderData.cs new file mode 100644 index 0000000..bcc10fa --- /dev/null +++ b/Assets/Editor/SceneLoaderData.cs @@ -0,0 +1,104 @@ +using System; +using System.Collections.Generic; +using System.IO; +using UnityEditor; +using UnityEngine; +using UnityEngine.SceneManagement; + +namespace BKK.EditorSceneManagement +{ + [CreateAssetMenu(menuName = "BKK/Editor Scene Management/", fileName = "SceneLoaderData")] + public class SceneLoaderData : ScriptableObject + { + public string relativeFolderPath = "Assets/"; + + public List sceneDataList = new List(); + + public LoadSceneMode loadSceneMode = LoadSceneMode.Single; + + public bool autoLoadSceneOnPlay = false; + + public int targetSceneEnumIndex = 0; + + /// + /// Scene Loader Data를 생성한다. + /// + /// + public static SceneLoaderData CreateData() + { + ScriptableObject instance = CreateInstance(typeof(SceneLoaderData)); + + string absoluteDataPath = Application.dataPath + SceneLoaderPath.defaultDataFolderPath; + + if (!Directory.Exists(absoluteDataPath)) + { + Directory.CreateDirectory(absoluteDataPath); + } + + AssetDatabase.CreateAsset(instance, SceneLoaderPath.defaultDataFilePath); + + return Resources.Load(SceneLoaderPath.defaultResourcesFilePath); + } + + /// + /// Scene Loader Data를 가져온다. + /// 없을 경우 CreateData()로 생성해서 가져온다. + /// + /// + public static SceneLoaderData GetData() + { + SceneLoaderData data = Resources.Load(SceneLoaderPath.defaultResourcesFilePath); + + return data ? data : CreateData(); + } + + /// + /// 플레이시 자동 로드할 Scene의 경로를 가져온다. + /// + /// + public string GetAutoLoadTargetScenePath() + { + if (sceneDataList.Count == 0) return string.Empty; + + return sceneDataList[targetSceneEnumIndex].scenePath; + } + + /// + /// 지정한 폴더 내에 모든 Scene 에셋을 각각 SceneData로 저장하여 sceneDataList에 저장한다. + /// + public void GetScenePathInFolder() + { + string[] scenePaths = Directory.GetFiles(Application.dataPath + relativeFolderPath.Substring(6),"*.unity"); + + sceneDataList.Clear(); + + for (int i = 0; i < scenePaths.Length; i++) + { + string sceneName = scenePaths[i].Substring(scenePaths[i].LastIndexOf('/') + 1); + string scenePath = scenePaths[i].Substring(scenePaths[i].IndexOf("Assets", StringComparison.Ordinal)); + sceneDataList.Add(new SceneData(sceneName, scenePath)); + } + } + } + + [System.Serializable] + public class SceneData + { + public string sceneName = ""; + + public string scenePath = ""; + + public SceneData(string name, string path) + { + sceneName = name; + scenePath = path; + } + } + + public static class SceneLoaderPath + { + public const string defaultDataFilePath = "Assets/Resources/SceneLoader/SceneLoaderData.asset"; + public const string defaultDataFolderPath = "/Resources/SceneLoader/"; + public const string defaultResourcesFilePath = "SceneLoader/SceneLoaderData"; + } +} \ No newline at end of file diff --git a/Assets/Editor/SceneLoaderData.cs.meta b/Assets/Editor/SceneLoaderData.cs.meta new file mode 100644 index 0000000..36a0003 --- /dev/null +++ b/Assets/Editor/SceneLoaderData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1d95d3fac84f448548afc41781b72917 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/SceneLoaderWindow.cs b/Assets/Editor/SceneLoaderWindow.cs new file mode 100644 index 0000000..6083457 --- /dev/null +++ b/Assets/Editor/SceneLoaderWindow.cs @@ -0,0 +1,173 @@ +using System; +using UnityEditor; +using UnityEditor.SceneManagement; +using UnityEngine; +using UnityEngine.SceneManagement; + +namespace BKK.EditorSceneManagement +{ + public class SceneLoaderWindow : EditorWindow + { + private SceneLoaderData sceneLoaderData; + + private static readonly string windowTitle = "Scene Loader"; + private readonly string pathLabel = "Path: "; + private readonly string chooseSceneFolderLabel = "Choose Scene Folder"; + private readonly string autoLoadOnPlayLabel = "Auto Load On Play"; + private readonly string targetSceneLabel = "Target Scene"; + private readonly string loadSceneModeLabel = "Load Scene Mode"; + private readonly string noSceneInPathLabel = "No Scene in Path."; + + private GUIStyle warningTextStyle; + + /// + /// Scene Loader Window 메뉴 클릭시 윈도우를 연다. + /// + [MenuItem("BKK/Editor Scene Management/Scene Loader")] + private static void Init() + { + SceneLoaderWindow window = GetWindow(); + window.titleContent = new GUIContent(windowTitle); + } + + /// + /// InitializeOnLoadMethod에 의해 유니티 에디터 로드 중에 호출된다. + /// 플레이 모드 변경시 호출할 LoadDefaultScene 메서드를 등록한다. + /// + [InitializeOnLoadMethod] + private static void InitAutoLoadScene() + { + EditorApplication.playModeStateChanged += LoadDefaultScene; + } + + /// + /// Edit + /// + /// + private static void LoadDefaultScene(PlayModeStateChange state) + { + // Edit 모드 나갈때 현재 수정 상태를 저장한다. + if (state == PlayModeStateChange.ExitingEditMode) + { + EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo(); + } + + // 플레이 모드에 진입할때 autoLoadSceneOnPlay가 True이면 목표 Scene을 로드한다. + if (state == PlayModeStateChange.EnteredPlayMode) + { + SceneLoaderData sceneLoaderData = SceneLoaderData.GetData(); + + if(!sceneLoaderData.autoLoadSceneOnPlay) return; + + LoadSceneParameters loadSceneParameters = new LoadSceneParameters(sceneLoaderData.loadSceneMode); + + EditorSceneManager.LoadSceneAsyncInPlayMode(sceneLoaderData.GetAutoLoadTargetScenePath(), loadSceneParameters); + } + } + + private void OnEnable() + { + // Scene Loader Data의 존재 여부 확인. 없으면 생성. + sceneLoaderData = Resources.Load(SceneLoaderPath.defaultResourcesFilePath); + + if (sceneLoaderData == null) + { + sceneLoaderData = SceneLoaderData.CreateData(); + } + + sceneLoaderData.GetScenePathInFolder();// 폴더 내 Scene 에셋들의 경로를 가져온다. + + // 폴더에 Scene 에셋이 없을때 출력할 안내문 스타일. + if (warningTextStyle == null) + warningTextStyle = new GUIStyle + { + normal = + { + textColor = Color.yellow, + }, + }; + } + + private void OnGUI() + { + Draw(); + } + + private void Draw() + { + sceneLoaderData.GetScenePathInFolder(); + + if(GUILayout.Button(chooseSceneFolderLabel)) + { + string newPath = GetFolderPath(); + + if (!string.IsNullOrEmpty(newPath)) + sceneLoaderData.relativeFolderPath = newPath; + } + + GUILayout.Label(pathLabel + sceneLoaderData.relativeFolderPath); + + if (sceneLoaderData.sceneDataList.Count == 0) + { + EditorGUILayout.LabelField(noSceneInPathLabel, warningTextStyle); + return; + } + + DrawSceneList(); + DrawPlayModeMenu(); + } + + private void DrawSceneList() + { + DrawLine(); + + for (int i = 0; i < sceneLoaderData.sceneDataList.Count; i++) + { + string sceneName = sceneLoaderData.sceneDataList[i].sceneName; + + if (GUILayout.Button(sceneName)) + { + EditorSceneManager.OpenScene(sceneLoaderData.sceneDataList[i].scenePath); + } + } + DrawLine(); + } + + private void DrawPlayModeMenu() + { + sceneLoaderData.autoLoadSceneOnPlay = EditorGUILayout.Toggle(autoLoadOnPlayLabel, sceneLoaderData.autoLoadSceneOnPlay); + + if (sceneLoaderData.autoLoadSceneOnPlay) + { + string[] optionList = new string[sceneLoaderData.sceneDataList.Count]; + + for (int i = 0; i < sceneLoaderData.sceneDataList.Count; i++) + { + optionList.SetValue(sceneLoaderData.sceneDataList[i].sceneName, i); + } + + sceneLoaderData.targetSceneEnumIndex = EditorGUILayout.Popup(targetSceneLabel, sceneLoaderData.targetSceneEnumIndex, optionList); + + sceneLoaderData.loadSceneMode = (LoadSceneMode)EditorGUILayout.EnumPopup(loadSceneModeLabel, sceneLoaderData.loadSceneMode); + } + } + + private void DrawLine() + { + EditorGUILayout.LabelField("", GUI.skin.horizontalSlider); + } + + /// + /// 폴더 경로 지정 패널을 열고 지정한 경로를 리턴한다. + /// + /// + private string GetFolderPath() + { + string absolutePath = EditorUtility.OpenFolderPanel(chooseSceneFolderLabel, Application.dataPath, ""); + + if (string.IsNullOrEmpty(absolutePath)) return string.Empty; + + return absolutePath.Substring(absolutePath.IndexOf("Assets", StringComparison.Ordinal)); + } + } +} \ No newline at end of file diff --git a/Assets/Editor/SceneLoaderWindow.cs.meta b/Assets/Editor/SceneLoaderWindow.cs.meta new file mode 100644 index 0000000..3b398ef --- /dev/null +++ b/Assets/Editor/SceneLoaderWindow.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5335f1e5c62ec46da9623bae277f6e72 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources.meta b/Assets/Resources.meta new file mode 100644 index 0000000..6a88589 --- /dev/null +++ b/Assets/Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 77677aa18659c4383835a5bead1dba13 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/SceneLoader.meta b/Assets/Resources/SceneLoader.meta new file mode 100644 index 0000000..72be164 --- /dev/null +++ b/Assets/Resources/SceneLoader.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b2943ae236e0f423dbd343328d48c959 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/SceneLoader/SceneLoaderData.asset b/Assets/Resources/SceneLoader/SceneLoaderData.asset new file mode 100644 index 0000000..9245149 --- /dev/null +++ b/Assets/Resources/SceneLoader/SceneLoaderData.asset @@ -0,0 +1,19 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1d95d3fac84f448548afc41781b72917, type: 3} + m_Name: SceneLoaderData + m_EditorClassIdentifier: + relativeFolderPath: Assets + sceneDataList: [] + loadSceneMode: 0 + autoLoadSceneOnPlay: 0 + targetSceneEnumIndex: 0 diff --git a/Assets/Resources/SceneLoader/SceneLoaderData.asset.meta b/Assets/Resources/SceneLoader/SceneLoaderData.asset.meta new file mode 100644 index 0000000..ad1cc70 --- /dev/null +++ b/Assets/Resources/SceneLoader/SceneLoaderData.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 69b01ac1fed944093aafc14f35618e63 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: