問題描述:今天發現工程中有些prefab上的腳本丟失了一些引用,本以為手動拖拽上去搞定,后來查看其它prefab,也有類似的問題,於是寫了一個小工具,批量修改下。
上代碼:
1 [ExecuteInEditMode] 2 [MenuItem("Tools/Add-HitData")] 3 private static void AddHitData() 4 { 5 if (EditorUtility.DisplayDialog("功能確認", 6 "此功能會遍歷8_AssetBundle/Prefab_Hero/下的全部prefab,並將prefab上的ANIMATION_DATA/HIT賦值到LeaderAction腳本中的HIT_DATA上,確定要執行嗎?", 7 "確定")) 8 { 9 string genPath = Application.dataPath + "/8_AssetBundle/Prefab_Hero/"; 10 string[] filesPath = Directory.GetFiles(genPath, "*.prefab", SearchOption.AllDirectories); 11 12 for (int i = 0; i < filesPath.Length; i++) 13 { 14 filesPath[i] = filesPath[i].Substring(filesPath[i].IndexOf("Assets")); 15 16 GameObject _prefab = AssetDatabase.LoadAssetAtPath(filesPath[i], typeof(GameObject)) as GameObject; 17 GameObject prefabGameobject = PrefabUtility.InstantiatePrefab(_prefab) as GameObject; 18 LeaderAction la = prefabGameobject.GetComponent<LeaderAction>(); 19 20 21 if (la != null) 22 { 23 if (la.HIT_DATA != null) continue; 24 if (prefabGameobject.transform.FindChild("ANIMATION_DATA/HIT") == null) continue; 25 la.HIT_DATA = prefabGameobject.transform.FindChild("ANIMATION_DATA/HIT").GetComponent<AnimationData>(); 26 PrefabUtility.ReplacePrefab(prefabGameobject, _prefab, ReplacePrefabOptions.Default); 27 MonoBehaviour.DestroyImmediate(prefabGameobject); 28 } 29 else 30 continue; 31 32 } 33 AssetDatabase.SaveAssets(); 34 EditorUtility.DisplayDialog("成功", "HIT_DATA 添加完成!", "確定"); 35 } 36 }
由於之前老是有同事亂點擊Tools中的工具導致一些不可預料的浪費時間,於是加上了二次提示框,僅供參考。
