1+ // **************************************************************** //
2+ //
3+ // Copyright (c) RimuruDev. All rights reserved.
4+ // Contact me:
5+ // - Gmail: rimuru.dev@gmail.com
6+ // - LinkedIn: https://www.linkedin.com/in/rimuru/
7+ // - GitHub: https://github.com/RimuruDev
8+ //
9+ // **************************************************************** //
10+
11+ using UnityEditor ;
12+ using UnityEngine ;
13+ using UnityEditorInternal ;
14+ using System . Collections . Generic ;
15+
16+ namespace RimuruDev
17+ {
18+ public sealed class SceneOrderEditor : EditorWindow
19+ {
20+ private ReorderableList sceneList ;
21+
22+ // ReSharper disable once FieldCanBeMadeReadOnly.Local // Note: Don't limit List with readonly!!!!
23+ private List < SceneAsset > scenes = new ( ) ;
24+
25+ private Vector2 scrollPos ;
26+ private string sceneFolderPath = "Assets/Scenes" ;
27+ private string namePattern = "Level_" ;
28+ private bool foldout = true ;
29+
30+ [ MenuItem ( "RimuruDev Tools/Scene Order Editor" ) ]
31+ public static void ShowWindow ( ) =>
32+ GetWindow ( typeof ( SceneOrderEditor ) , false , "Scene Order Editor" ) ;
33+
34+ private void OnEnable ( )
35+ {
36+ sceneList = new ReorderableList ( scenes , typeof ( SceneAsset ) , true , true , true , true )
37+ {
38+ drawHeaderCallback = rect => { EditorGUI . LabelField ( rect , "Drag Scenes Here:" ) ; } ,
39+ drawElementCallback = ( rect , index , _ , _ ) =>
40+ {
41+ scenes [ index ] = ( SceneAsset ) EditorGUI . ObjectField (
42+ position : new Rect ( rect . x , rect . y , rect . width , EditorGUIUtility . singleLineHeight ) ,
43+ scenes [ index ] ,
44+ typeof ( SceneAsset ) ,
45+ allowSceneObjects : false
46+ ) ;
47+ }
48+ } ;
49+ }
50+
51+ private void OnGUI ( )
52+ {
53+ EditorGUI . BeginChangeCheck ( ) ;
54+ foldout = EditorGUILayout . Foldout ( foldout , "Scene Folder Path and Naming Pattern" , true ) ;
55+
56+ if ( foldout )
57+ {
58+ sceneFolderPath = EditorGUILayout . TextField ( "Folder Path:" , sceneFolderPath ) ;
59+ namePattern = EditorGUILayout . TextField ( "Name Pattern:" , namePattern ) ;
60+
61+ if ( GUILayout . Button ( "Load Scenes From Folder" ) )
62+ LoadScenesFromFolder ( ) ;
63+ }
64+
65+ if ( EditorGUI . EndChangeCheck ( ) )
66+ LoadScenesFromFolder ( ) ;
67+
68+ scrollPos = GUILayout . BeginScrollView (
69+ scrollPos ,
70+ GUILayout . Width ( position . width ) ,
71+ GUILayout . Height ( position . height - 200 ) ) ;
72+
73+ sceneList . DoLayoutList ( ) ;
74+
75+ GUILayout . EndScrollView ( ) ;
76+
77+ if ( GUILayout . Button ( "Rename and Reorder Scenes" ) )
78+ RenameScenes ( ) ;
79+ }
80+
81+ private void LoadScenesFromFolder ( )
82+ {
83+ scenes . Clear ( ) ;
84+
85+ var guids = AssetDatabase . FindAssets ( "t:Scene" , new [ ] { sceneFolderPath } ) ;
86+
87+ foreach ( var guid in guids )
88+ {
89+ var path = AssetDatabase . GUIDToAssetPath ( guid ) ;
90+ var sceneAsset = AssetDatabase . LoadAssetAtPath < SceneAsset > ( path ) ;
91+
92+ if ( sceneAsset != null )
93+ scenes . Add ( sceneAsset ) ;
94+ }
95+ }
96+
97+ private void RenameScenes ( )
98+ {
99+ for ( var i = 0 ; i < scenes . Count ; i ++ )
100+ {
101+ var path = AssetDatabase . GetAssetPath ( scenes [ i ] ) ;
102+ var tempSceneName = $ "Temp_{ namePattern } { i } ";
103+
104+ AssetDatabase . RenameAsset ( path , tempSceneName ) ;
105+ }
106+
107+ AssetDatabase . SaveAssets ( ) ;
108+ AssetDatabase . Refresh ( ) ;
109+
110+ for ( var i = 0 ; i < scenes . Count ; i ++ )
111+ {
112+ var oldPath = AssetDatabase . GetAssetPath ( scenes [ i ] ) ;
113+ var newSceneName = $ "{ namePattern } { i } ";
114+
115+ AssetDatabase . RenameAsset ( oldPath , newSceneName ) ;
116+ }
117+
118+ AssetDatabase . SaveAssets ( ) ;
119+ AssetDatabase . Refresh ( ) ;
120+
121+ Debug . Log ( "<color=yellow>Scenes renamed and reordered based on the list.</color>" ) ;
122+ }
123+ }
124+ }
0 commit comments