Skip to content

Commit 764ffd7

Browse files
committed
modified exporter to support ScriptableObject type
1 parent 4617884 commit 764ffd7

File tree

3 files changed

+40
-23
lines changed

3 files changed

+40
-23
lines changed

Scripts/Editor/Exporters/DllGuidExporter.cs

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ public static void Export()
3333

3434
// 2. 加載 dll
3535
Assembly asm = Assembly.LoadFrom(dllFullPath);
36-
// 3. 找到所有 MonoBehaviour 子類
36+
// 3. 找到所有 MonoBehaviour 或 ScriptableObject 子類
3737
var mbTypes = asm.GetTypes()
38-
.Where(t => typeof(MonoBehaviour).IsAssignableFrom(t) && !t.IsAbstract)
39-
.ToArray();
38+
.Where(t => !t.IsAbstract && (typeof(MonoBehaviour).IsAssignableFrom(t) || typeof(ScriptableObject).IsAssignableFrom(t)))
39+
.ToArray();
4040

4141
// 4. 構建映射表
4242
var list = mbTypes.Select(t =>
@@ -46,14 +46,23 @@ public static void Export()
4646

4747
// 用一個臨時實例獲取 MonoScript 資源
4848
// 嘗試通過反射訪問類型並獲取 MonoScript
49-
MonoBehaviour dummyInstance = new GameObject("Dummy").AddComponent(t) as MonoBehaviour;
50-
if (dummyInstance != null)
49+
if (typeof(MonoBehaviour).IsAssignableFrom(t))
5150
{
52-
MonoScript monoScript = MonoScript.FromMonoBehaviour(dummyInstance);
53-
// 清理臨時對象
54-
UnityEngine.Object.DestroyImmediate(dummyInstance.gameObject);
55-
// 獲取 GUID 和 fileID
56-
AssetDatabase.TryGetGUIDAndLocalFileIdentifier(monoScript, out guid, out fileID);
51+
// 用臨時 GameObject + Component 取得 MonoScript
52+
var go = new GameObject("Dummy");
53+
var mb = go.AddComponent(t) as MonoBehaviour;
54+
var mono = MonoScript.FromMonoBehaviour(mb);
55+
UnityEngine.Object.DestroyImmediate(go);
56+
AssetDatabase.TryGetGUIDAndLocalFileIdentifier(mono, out guid, out fileID);
57+
}
58+
// ScriptableObject
59+
else
60+
{
61+
// 用 CreateInstance 取得 MonoScript
62+
var so = ScriptableObject.CreateInstance(t);
63+
var mono = MonoScript.FromScriptableObject(so);
64+
UnityEngine.Object.DestroyImmediate(so);
65+
AssetDatabase.TryGetGUIDAndLocalFileIdentifier(mono, out guid, out fileID);
5766
}
5867

5968
return new ScriptMapEntry

Scripts/Editor/Exporters/ScriptGuidExporter.cs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,16 @@ public static void Export()
1616
.Select(AssetDatabase.GUIDToAssetPath)
1717
.ToArray();
1818

19-
// 2. 分出選中的文件夾和選中的非文件夾
19+
// 2. 選中文件夾類型
2020
var folderPaths = allSelectedPaths
2121
.Where(path => AssetDatabase.IsValidFolder(path))
2222
.ToArray();
2323

24+
// 3. 選中非文件夾類型
2425
var directAssetPaths = allSelectedPaths
2526
.Where(path =>
2627
!AssetDatabase.IsValidFolder(path) &&
28+
// 支持文件類型
2729
(path.EndsWith(".cs"))
2830
)
2931
.ToArray();
@@ -40,31 +42,34 @@ public static void Export()
4042
return;
4143
}
4244

43-
// 3. 從選中的文件夾裡過濾類型
45+
// 4. 從選中的文件夾裡過濾類型
4446
var foundInFolders = new List<string>();
4547
if (folderPaths.Length > 0)
4648
{
47-
var guidsInFolders = AssetDatabase.FindAssets("t:MonoScript", folderPaths);
49+
// 支持文件類型
50+
var guidsInFolders = AssetDatabase.FindAssets("t:MonoScript t:Script", folderPaths);
4851
foundInFolders = guidsInFolders
4952
.Select(AssetDatabase.GUIDToAssetPath)
5053
.ToList();
5154
}
5255

53-
// 4. 合併選擇路徑
56+
// 5. 合併選擇路徑
5457
var targets = foundInFolders
5558
.Concat(directAssetPaths)
5659
.Distinct();
5760

58-
// 5. 處理每一個文件
61+
// 6. 處理每一個文件
5962
var list = targets
6063
.Select(path =>
6164
{
6265
string guid = AssetDatabase.AssetPathToGUID(path);
6366
var ms = AssetDatabase.LoadAssetAtPath<MonoScript>(path);
6467
var type = ms.GetClass();
6568

66-
// 過濾不是 MonoBehaviour 的類別
67-
if (type == null || !typeof(MonoBehaviour).IsAssignableFrom(type))
69+
// 過濾類別
70+
if (type == null ||
71+
// 如果不是 MonoBehaviour 也不是 ScriptableObject 就過濾掉
72+
!(typeof(MonoBehaviour).IsAssignableFrom(type) || typeof(ScriptableObject).IsAssignableFrom(type)))
6873
return null;
6974

7075
AssetDatabase.TryGetGUIDAndLocalFileIdentifier(ms, out string assetGuid, out long fileId);
@@ -79,11 +84,11 @@ public static void Export()
7984
.Where(info => info != null)
8085
.ToArray();
8186

82-
// 4. 寫入 JSON
87+
// 7. 寫入 JSON
8388
var wrapper = new Wrapper { items = list };
8489
string json = JsonUtility.ToJson(wrapper, true);
8590

86-
// 5. 讓使用者在專案內選擇儲存位置和檔名
91+
// 8. 讓使用者在專案內選擇儲存位置和檔名
8792
string defaultFileName = "mono_source_code_guid_map.json";
8893
string savePath = EditorUtility.SaveFilePanelInProject
8994
(
@@ -100,7 +105,7 @@ public static void Export()
100105
return;
101106
}
102107

103-
// 6. 寫入並更新 AssetDatabase
108+
// 9. 寫入並更新 AssetDatabase
104109
File.WriteAllText(savePath, json);
105110
AssetDatabase.Refresh();
106111

Scripts/Editor/MapApplier.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ public static void ApplyMap(Wrapper oldWrapper, Wrapper newWrapper)
115115
.Select(AssetDatabase.GUIDToAssetPath)
116116
.ToArray();
117117

118-
// 2. 選種文件夾類型
118+
// 2. 選中文件夾類型
119119
var folderPaths = allSelectedPaths
120120
.Where(path => AssetDatabase.IsValidFolder(path))
121121
.ToArray();
@@ -145,10 +145,13 @@ public static void ApplyMap(Wrapper oldWrapper, Wrapper newWrapper)
145145
var foundInFolders = new List<string>();
146146
if (folderPaths.Length > 0)
147147
{
148-
// 支持文件類型
149-
var guidsInFolders = AssetDatabase.FindAssets("t:Prefab t:Scene t:ScriptableObject", folderPaths);
148+
var guidsInFolders = AssetDatabase.FindAssets(string.Empty, folderPaths);
150149
foundInFolders = guidsInFolders
151150
.Select(AssetDatabase.GUIDToAssetPath)
151+
.Where(path =>
152+
!AssetDatabase.IsValidFolder(path) &&
153+
// 支持文件類型
154+
(path.EndsWith(".prefab") || path.EndsWith(".unity") || path.EndsWith(".asset")))
152155
.ToList();
153156
}
154157

0 commit comments

Comments
 (0)