Unity编辑器(Editor)的问题全解以及使用
最近寫了一個(gè)Unity優(yōu)化工具,主要是搜索某一個(gè)文件夾中所有的場(chǎng)景和預(yù)設(shè)。如果是場(chǎng)景的話,就遍歷場(chǎng)景中的所有對(duì)象,觀察對(duì)象身上是否綁定了AudioListener組件,如果有的話移除該組件并保存場(chǎng)景。如果是預(yù)設(shè)的話,就遍歷預(yù)設(shè)中的所有對(duì)象,觀察預(yù)設(shè)中的對(duì)象是否綁定AudioListener組件,如果有的話移除該組件。
腳本如下:
增加:過濾非指定資源的執(zhí)行(動(dòng)畫代碼修改:)
using ML_Animation; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using UnityEditor; using UnityEngine;class BlendAnimation : EditorWindow {public static string[] saveLimitKey = new string[] {//"Bip001 Footsteps","Bip001 Pelvis","Bip001 Spine","Bip001 L Thigh","Bip001 R Thigh","Bip001 L Calf", "Bip001 R Calf",//"Bip001 L Foot", "Bip001 R Foot",//"Bip001 L Toe0","Bip001 R Toe0", "Bip001 L Toe0Nub","Bip001 R Toe0Nub",//"Bip001 Spine1","Bone017","Bone021",//"Bip001 Prop1","Dummy001"};private static StringBuilder strBuilder;private static OptimizeAnimationClipProperty optAnimProperty = null;[MenuItem("Assets/優(yōu)化/動(dòng)畫/選中AnimationClip-ModifyHeroCameraFOV", true, 0)]public static bool AnimationAddProperty_(){AnimationClip clip = Selection.activeObject as AnimationClip;if (clip == null)return false;elsereturn true;}[MenuItem("Assets/優(yōu)化/動(dòng)畫/選中AnimationClip-ModifyHeroCameraFOV", false, 0)]public static void AnimationAddProperty(){UnityEngine.Object[] objs = Selection.GetFiltered(typeof(AnimationClip), SelectionMode.DeepAssets);int count = 0;foreach (UnityEngine.Object obj in objs){++count;EditorUtility.DisplayProgressBar("正在修改動(dòng)畫,請(qǐng)勿操作Unity!!!", count + "/" + objs.Length, count * 1.0f / objs.Length);AnimationClip clip = obj as AnimationClip;EditorCurveBinding[] curveBindings = AnimationUtility.GetCurveBindings(clip);for (int i = 0; i < curveBindings.Length; i++){EditorCurveBinding curveBind = curveBindings[i];if (curveBind.type == typeof(Camera)){AnimationCurve animCurve = AnimationUtility.GetEditorCurve(clip, curveBind);AnimationUtility.SetEditorCurve(clip, curveBind, null);curveBind.path = "cam/m_3DHeroCamera";AnimationUtility.SetEditorCurve(clip, curveBind, animCurve);AnimationCurve addCurve = new AnimationCurve();addCurve.AddKey(0, 0);addCurve.AddKey(clip.length, 0);clip.SetCurve("cam/m_3DHeroCamera", typeof(Transform), "m_LocalRotation.x", addCurve);clip.SetCurve("cam/m_3DHeroCamera", typeof(Transform), "m_LocalRotation.y", addCurve);clip.SetCurve("cam/m_3DHeroCamera", typeof(Transform), "m_LocalRotation.z", addCurve);}}}AssetDatabase.Refresh();EditorUtility.ClearProgressBar();}[MenuItem("Assets/優(yōu)化/動(dòng)畫/選中AnimationClip-優(yōu)化動(dòng)畫", false, 1)]public static void AnimOptimizeTrilogy(){int count = 0;UnityEngine.Object[] objs = Selection.GetFiltered(typeof(AnimationClip), SelectionMode.DeepAssets);foreach (UnityEngine.Object o in objs){count++;EditorUtility.DisplayProgressBar("優(yōu)化動(dòng)畫三部曲...", AssetDatabase.GetAssetPath(o), count * 1.0f / objs.Length);AnimationClip clip = RemoveAnimationSameKeyframe(o as AnimationClip);ExecuteOptimaze_(clip);ReduceAnimationCurve(ref clip);}AssetDatabase.SaveAssets();EditorUtility.ClearProgressBar();}[MenuItem("Assets/優(yōu)化/動(dòng)畫/選中Prefab-優(yōu)化動(dòng)畫", false, 2)]public static void OptimizeAnimation(){strBuilder = new StringBuilder();optAnimProperty = new OptimizeAnimationClipProperty();UnityEngine.Object[] objs = Selection.GetFiltered(typeof(UnityEngine.Object), SelectionMode.DeepAssets);for (int i = 0; i < objs.Length; i++){EditorUtility.DisplayProgressBar("優(yōu)化動(dòng)畫三部曲...", AssetDatabase.GetAssetPath(objs[i]), i * 1.0f / objs.Length);string path = AssetDatabase.GetAssetPath(objs[i]);string suffix = Path.GetExtension(path);if (suffix == ".prefab"){optAnimProperty.AllPrefabNum++;OptimizeAnimationClips(path);}}PrintLog();AssetDatabase.SaveAssets();EditorUtility.ClearProgressBar();}public static void OptimizeAnimationClips(string path){bool isModifyAnimClip = false;List<string> optAnims = new List<string>();string[] depends = AssetDatabase.GetDependencies(path);for (int i = 0; i < depends.Length; i++){if (Path.GetExtension(depends[i]) == ".anim"){if (optAnimProperty.hadOperation.Contains(depends[i])){continue;}else{optAnimProperty.hadOperation.Add(depends[i]);optAnims.Add(depends[i]);}AnimationClip clip = AssetDatabase.LoadAssetAtPath(depends[i], typeof(AnimationClip)) as AnimationClip;if (clip == null){Debug.LogError(depends[i] + " is not Exist");continue;}clip = RemoveAnimationSameKeyframe(clip);ExecuteOptimaze_(clip);ReduceAnimationCurve(ref clip);optAnimProperty.ModifyAnimNum++;isModifyAnimClip = true;}}if (optAnims.Count > 0){optAnimProperty.dicLog.Add(path, optAnims);}if (isModifyAnimClip)optAnimProperty.ModifyPrefabNum++;}//[MenuItem("Assets/優(yōu)化/動(dòng)畫/精簡動(dòng)畫小數(shù)點(diǎn)")]private static void AnimationDataOptimaze(){int number = 0;DateTime time = DateTime.Now;foreach (UnityEngine.Object o in Selection.GetFiltered(typeof(AnimationClip), SelectionMode.DeepAssets)){number++;ExecuteOptimaze(Instantiate(o) as AnimationClip, AssetDatabase.GetAssetPath(o));}AssetDatabase.SaveAssets();Debug.Log("一共壓縮了" + number + "個(gè)動(dòng)畫文件!");Debug.Log("耗時(shí):" + (DateTime.Now - time).TotalMilliseconds / 1000 + "秒.");}//[MenuItem("Assets/優(yōu)化/動(dòng)畫/優(yōu)化動(dòng)畫小數(shù)點(diǎn),不對(duì)動(dòng)畫重新創(chuàng)建")]public static void OptimazeAnimationDecimalPoint(){int count = 0;UnityEngine.Object[] objs = Selection.GetFiltered(typeof(AnimationClip), SelectionMode.DeepAssets);foreach (UnityEngine.Object o in objs){count++;EditorUtility.DisplayProgressBar("優(yōu)化動(dòng)畫小數(shù)點(diǎn),不重新創(chuàng)建動(dòng)畫", count + "/" + objs.Length, count * 1.0f / objs.Length);ExecuteOptimaze_(o as AnimationClip);}EditorUtility.ClearProgressBar();}private static AnimationClip ExecuteOptimaze_(AnimationClip clip){EditorCurveBinding[] curveBindings = AnimationUtility.GetCurveBindings(clip);for (int i = 0; i < curveBindings.Length; i++){AnimationCurve animCurve = AnimationUtility.GetEditorCurve(clip, curveBindings[i]);var keyFrames = animCurve.keys;for (int j = 0; j < keyFrames.Length; j++){var key = keyFrames[j];key.value = float.Parse(key.value.ToString("f4"));key.inTangent = float.Parse(key.inTangent.ToString("f4"));key.outTangent = float.Parse(key.outTangent.ToString("f4"));keyFrames[j] = key;}animCurve.keys = keyFrames;AnimationUtility.SetEditorCurve(clip, curveBindings[i], animCurve);}//AssetDatabase.SaveAssets();return clip;}private static AnimationClip ExecuteOptimaze(AnimationClip clip, string clipName){EditorCurveBinding[] curveBindings = AnimationUtility.GetCurveBindings(clip);AnimationClipCurveData[] curves = new AnimationClipCurveData[curveBindings.Length];for (int index = 0; index < curves.Length; ++index){curves[index] = new AnimationClipCurveData(curveBindings[index]);curves[index].curve = AnimationUtility.GetEditorCurve(clip, curveBindings[index]);}foreach (AnimationClipCurveData curveDate in curves){var keyFrames = curveDate.curve.keys;for (int i = 0; i < keyFrames.Length; i++){var key = keyFrames[i];key.value = float.Parse(key.value.ToString("f4"));key.inTangent = float.Parse(key.inTangent.ToString("f4"));key.outTangent = float.Parse(key.outTangent.ToString("f4"));keyFrames[i] = key;}curveDate.curve.keys = keyFrames;clip.SetCurve(curveDate.path, curveDate.type, curveDate.propertyName, curveDate.curve);}AssetDatabase.CreateAsset(clip, clipName);return clip;}private static void ControlAnimationMetaFile(string metaPath, bool bRead){if (bRead){strBuilder = new StringBuilder();FileStream fs = new FileStream(metaPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);StreamReader sr = new StreamReader(fs, System.Text.Encoding.Default);while (!sr.EndOfStream){strBuilder.AppendLine(sr.ReadLine());}sr.Dispose();}else{if (File.Exists(metaPath))File.Delete(metaPath);StreamWriter sw = new StreamWriter(metaPath);sw.Write(strBuilder);sw.Dispose();}}//[MenuItem("Assets/優(yōu)化/動(dòng)畫/移除相同關(guān)鍵幀")]public static void AnimationRemoveKeyFrame(){UnityEngine.Object[] objs = Selection.objects;for (int i = 0; i < objs.Length; i++){UnityEngine.Object obj = objs[i];if (obj.GetType() == typeof(AnimationClip)){EditorUtility.DisplayProgressBar("移除動(dòng)畫相同關(guān)鍵幀...", AssetDatabase.GetAssetPath(obj), i * 1.0f / objs.Length);RemoveAnimationSameKeyframe(obj as AnimationClip);}}AssetDatabase.SaveAssets();EditorUtility.ClearProgressBar();}public static AnimationClip RemoveAnimationSameKeyframe(AnimationClip clip){string path = AssetDatabase.GetAssetPath(clip);EditorCurveBinding[] curveBindings = AnimationUtility.GetCurveBindings(clip);foreach (var curve in curveBindings){AnimationCurve animCurve = AnimationUtility.GetEditorCurve(clip, curve);if (animCurve.keys.Length > 1 && !curve.isPPtrCurve){Keyframe cntKeyframe = animCurve.keys[0];List<Keyframe> m_Keyframes = new List<Keyframe>();m_Keyframes.Add(cntKeyframe);int sameIndex = 0;for (int i = 1; i < animCurve.keys.Length; ++i){Keyframe item = animCurve.keys[i];m_Keyframes.Add(item);if (Mathf.Abs(item.value - cntKeyframe.value) > 0.00001f|| i == animCurve.keys.Length - 1|| Math.Abs(item.inTangent - cntKeyframe.inTangent) > 0.00001f|| Math.Abs(item.outTangent - cntKeyframe.outTangent) > 0.00001f|| item.tangentMode != cntKeyframe.tangentMode){sameIndex = 0;}else{sameIndex += 1;}cntKeyframe = item;if (sameIndex > 1){m_Keyframes.RemoveAt(m_Keyframes.Count - 2);}}animCurve.keys = m_Keyframes.ToArray();AnimationUtility.SetEditorCurve(clip, curve, animCurve);}}return clip;}[MenuItem("Assets/優(yōu)化/動(dòng)畫/根據(jù)FBX(原始資源)生成混合動(dòng)畫", false, 3)]public static void AnimationOptimization(){List<AnimationClip> animClips = new List<AnimationClip>();UnityEngine.Object[] animObjs = Selection.objects;for (int i = 0; i < animObjs.Length; i++){AnimationClip anim = animObjs[i] as AnimationClip;if (anim){animClips.Add(anim);}}UnityEngine.Object[] objs = Selection.GetFiltered(typeof(UnityEngine.Object), SelectionMode.DeepAssets);for (int i = 0; i < objs.Length; i++){string path = AssetDatabase.GetAssetPath(objs[i]);string suffix = Path.GetExtension(path).ToLower();if (suffix == ".fbx"){GetAnimationClip(path, animClips);}}}public static void GetAnimationClip(string fbxPath, List<AnimationClip> animClips){UnityEngine.Object[] objs = AssetDatabase.LoadAllAssetRepresentationsAtPath(fbxPath);AnimationClip idleClip = null;for (int i = 0; i < objs.Length; i++){idleClip = objs[i] as AnimationClip;if (idleClip != null && !idleClip.name.ToLower().Contains("action")){if (animClips.Count > 0){if (animClips.Contains(idleClip))CreateBlendAnimation(idleClip, fbxPath);elsecontinue;}else{CreateBlendAnimation(idleClip, fbxPath);}}elsecontinue;}}public static void CreateBlendAnimation(AnimationClip idleClip, string fbxPath){List<AnimationClipCurveData> lstAnimClipCurve = new List<AnimationClipCurveData>();List<AnimationClipCurveData> lstAnimCompressClipCurve = new List<AnimationClipCurveData>();List<AnimationClipCurveData> lstAnimBlendClipCurve = new List<AnimationClipCurveData>();//AnimationClip clip = AssetDatabase.LoadAssetAtPath<AnimationClip>(fbxPath);ModelImporter importer = AssetImporter.GetAtPath(fbxPath) as ModelImporter;if (idleClip == null || importer == null)return;if (importer.animationCompression != ModelImporterAnimationCompression.Off){importer.animationCompression = ModelImporterAnimationCompression.Off;importer.SaveAndReimport();}AnimationClip blendAnimClip = UnityEngine.Object.Instantiate(idleClip);blendAnimClip.ClearCurves();lstAnimClipCurve = RecordAnimationCurve(idleClip);importer.animationCompression = ModelImporterAnimationCompression.KeyframeReduction;importer.SaveAndReimport();lstAnimCompressClipCurve = RecordAnimationCurve(idleClip);for (int i = 0; i < lstAnimClipCurve.Count; i++){string[] splitPath = lstAnimClipCurve[i].path.Split('/');string keys = splitPath[splitPath.Length - 1];if (saveLimitKey.ToList().Contains(keys)){lstAnimBlendClipCurve.Add(lstAnimClipCurve[i]);}else{lstAnimBlendClipCurve.Add(lstAnimCompressClipCurve[i]);}}for (int i = 0; i < lstAnimBlendClipCurve.Count; i++){AnimationClipCurveData data = lstAnimBlendClipCurve[i];blendAnimClip.SetCurve(data.path, data.type, data.propertyName, data.curve);}ReduceAnimationCurve(ref blendAnimClip);string path2 = string.Format("{0}/{1}.anim", Path.GetDirectoryName(fbxPath), idleClip.name);SaveAnim(blendAnimClip, path2);}/// <summary>/// 記錄AnimationClip的曲線/// </summary>/// <param name="clip"></param>/// <returns></returns>public static List<AnimationClipCurveData> RecordAnimationCurve(AnimationClip clip){EditorCurveBinding[] curveBindings = AnimationUtility.GetCurveBindings(clip);List<AnimationClipCurveData> curveDatas = new List<AnimationClipCurveData>();for (int i = 0; i < curveBindings.Length; i++){AnimationCurve animCurve = AnimationUtility.GetEditorCurve(clip, curveBindings[i]);AnimationClipCurveData curveData = new AnimationClipCurveData(curveBindings[i]);curveData.curve = animCurve;curveDatas.Add(curveData);}return curveDatas;}/// <summary>/// 移除動(dòng)畫不必要的曲線/// </summary>/// <param name="clip"></param>public static void ReduceAnimationCurve(ref AnimationClip clip){SerializedObject serializedObject = new SerializedObject(clip);serializedObject.FindProperty("m_EditorCurves").arraySize = 0;serializedObject.FindProperty("m_EulerEditorCurves").arraySize = 0;//serializedObject.FindProperty("m_FloatCurves").arraySize = 0;serializedObject.ApplyModifiedProperties();}public static void SaveAnim(AnimationClip clip, string clipName){if (!Directory.Exists(Path.GetDirectoryName(clipName))){Directory.CreateDirectory(Path.GetDirectoryName(clipName));}//clip.legacy = true;//clip.wrapMode = WrapMode.Loop;AssetDatabase.CreateAsset(clip, clipName);AssetDatabase.Refresh();}private static void PrintLog(){string path = Application.dataPath.Replace("Assets", "ProfilerData/AnimOptimize.txt");Debug.Log(path);if (!Directory.Exists(Path.GetDirectoryName(path))){Directory.CreateDirectory(Path.GetDirectoryName(path));}if (File.Exists(path))File.Delete(path);foreach (var item in optAnimProperty.dicLog){string labelName = string.Empty;for (int i = 0; i < item.Value.Count; i++){labelName += item.Value[i] + ",";}strBuilder.Append(string.Format("{0}:{1}\n", item.Key, labelName));}strBuilder.Append(string.Format("檢索Prefab數(shù)量:{0}\n需要修改的Prefab數(shù)量:{1},占總量的:{2}%\n修改的Animation數(shù)量:{3}", optAnimProperty.AllPrefabNum, optAnimProperty.ModifyPrefabNum, optAnimProperty.ModifyPrefabNum * 1.0f / optAnimProperty.AllPrefabNum * 100, optAnimProperty.ModifyAnimNum));using (StreamWriter sw = new StreamWriter(path)){sw.Write(strBuilder);sw.Dispose();}} }public class OptimizeAnimationClipProperty {public int AllPrefabNum;public int ModifyAnimNum;public int ModifyPrefabNum;public Dictionary<string, List<string>> dicLog = null;public List<string> hadOperation = null;public OptimizeAnimationClipProperty(){dicLog = new Dictionary<string, List<string>>();hadOperation = new List<string>();} } using UnityEngine; using System.Collections; using UnityEditor; using System.Collections.Generic; using System.IO; using UnityEditor.SceneManagement; using UnityEngine.SceneManagement;public class SceneOptimize : Editor {#region 場(chǎng)景優(yōu)化//某一文件夾中的所有場(chǎng)景的路徑,復(fù)制的場(chǎng)景路徑用于把所有場(chǎng)景都復(fù)制到另一個(gè)文件夾中public static List<string> optimizedScenePaths;//某一文件夾中的所有場(chǎng)景的路徑public static List<string> optimizedOriginalScenePaths;[MenuItem("Tools/場(chǎng)景優(yōu)化")]public static void CopyAndOptimizeScenes(){//復(fù)制的場(chǎng)景路徑optimizedScenePaths = new List<string>();//原來的場(chǎng)景路徑optimizedOriginalScenePaths = new List<string>();//項(xiàng)目的路徑,eg:D:/Project/Test/Assetsstring headPath = Application.dataPath;//Debug.Log(headPath);//Debug.Log(headPath.IndexOf("Assets"));//eg:D:/Project/Test/headPath = headPath.Substring(0, headPath.IndexOf("Assets"));Debug.Log(headPath);try{//復(fù)制場(chǎng)景到另一個(gè)文件夾中//CopyAllScenes("Assets/Level", "Assets/Level_optimized", headPath);//獲取某一文件夾中所有場(chǎng)景的Path信息AddRootSourcePathToList("Assets/Level", headPath, "Scene", ref optimizedOriginalScenePaths);}catch (System.Exception e){PlayerPrefs.SetInt("ModifySaving", 0);Debug.LogError(e);}//遍歷出所有場(chǎng)景的路徑for (int i = 0; i < optimizedOriginalScenePaths.Count; i++){PlayerPrefs.SetInt("ModifySaving", 0);//顯示遍歷場(chǎng)景時(shí)候的進(jìn)度條EditorUtility.DisplayCancelableProgressBar("Scene Optimizing Bar", "Save And Optimize Scenes" + i + "/" + optimizedOriginalScenePaths.Count, (float)i / optimizedOriginalScenePaths.Count);try{Debug.Log(optimizedOriginalScenePaths[i]);//獲取到場(chǎng)景的完整路徑string tempPath = headPath + "Assets/Level/";Debug.Log("tempPath :" + tempPath);//只獲取場(chǎng)景的名字(eg:Main.unity,Main場(chǎng)景的全稱)string tempScene = optimizedOriginalScenePaths[i].Substring(tempPath.Length);Debug.Log("tempScene:" + tempScene);//增加判斷條件,對(duì)于不需要做修改的場(chǎng)景if(tempScene == "Main.unity"){Debug.Log("Continue");continue;}//打開場(chǎng)景EditorSceneManager.OpenScene(optimizedOriginalScenePaths[i], OpenSceneMode.Single);//開始優(yōu)化AudioListenerOptimize();PlayerPrefs.SetInt("ModifySaving", 1);//保存修改之后的場(chǎng)景EditorSceneManager.SaveScene(SceneManager.GetActiveScene());}catch (System.Exception e){PlayerPrefs.SetInt("ModifySaving", 0);//如果發(fā)生錯(cuò)誤,要關(guān)閉加載時(shí)候顯示的滾動(dòng)條EditorUtility.ClearProgressBar();Debug.Log(e);}}//加載完畢,關(guān)閉滾動(dòng)條EditorUtility.ClearProgressBar();Debug.Log("finished");PlayerPrefs.SetInt("ModifySaving", 0);}//對(duì)于要修改的內(nèi)容public static void AudioListenerOptimize(){//獲取一個(gè)場(chǎng)景中所有的綁定了AudioListener對(duì)象AudioListener[] audios = FindObjectsOfType<AudioListener>();for (int i = 0; i < audios.Length; i++){if (audios[i] is AudioListener){//移除對(duì)象身上的AudioListener組件DestroyImmediate(audios[i].GetComponent<AudioListener>(),true);}}}/// <summary>/// 復(fù)制場(chǎng)景到另一個(gè)文件夾中/// </summary>/// <param name="rootPath"></param>/// <param name="targetPath"></param>/// <param name="headPath"></param>public static void CopyAllScenes(string rootPath, string targetPath, string headPath){if (Directory.Exists(rootPath)){string[] guids;guids = AssetDatabase.FindAssets("t:Scene", new[] { rootPath });foreach (string guid in guids){Debug.Log("guid: " + guid);string source = AssetDatabase.GUIDToAssetPath(guid);Debug.Log("source: " + source);string dest = source;Debug.Log("dest: " + dest);for (int i = 0; i < CountSubString("Level", "/") + 2; i++){Debug.Log("dest.IndexOf: " + dest.IndexOf("/"));dest = dest.Substring(dest.IndexOf("/") + 1);}dest = "/" + dest;Debug.Log("dest: " + dest);dest = targetPath + dest;Debug.Log("dest: " + dest);CopySingleScene(source, dest, headPath);}}else{Debug.Log("No source path");}}public static void CopySingleScene(string source, string dest, string headPath){source = headPath + source;dest = headPath + dest;string destDirectory = dest.Substring(0, dest.LastIndexOf("/"));if (!Directory.Exists(destDirectory)){Directory.CreateDirectory(destDirectory);}dest = dest.Substring(0, dest.LastIndexOf(".")) + "_Optimized.unity";File.Copy(source, dest, true);optimizedScenePaths.Add(dest);}public static int CountSubString(string targetString, string subString){int p = 0;while (targetString.Contains(subString)){p++;targetString = targetString.Substring(targetString.IndexOf(subString) + 1);}Debug.Log("p:" + p);return p;}#endregion/// <summary>/// 根據(jù)在固定文件夾中的路徑,根據(jù)類型(type)搜索該文件夾中的所符合的對(duì)象,然后把這些對(duì)象的路徑添加到array中/// </summary>/// <param name="rootPath">目標(biāo)文件路徑(eg:Assets/Scenes)</param>/// <param name="headPath">項(xiàng)目路徑(eg:D:Project/Test/)</param>/// <param name="searchType">搜索類型(Scene(搜索的是場(chǎng)景),Prefab(搜多的是預(yù)設(shè)))</param>/// <param name="array"></param>public static void AddRootSourcePathToList(string rootPath, string headPath, string searchType, ref List<string> array){if (Directory.Exists(rootPath)){string[] guids;//搜索guids = AssetDatabase.FindAssets("t:" + searchType, new[] { rootPath });foreach (string guid in guids){string source = AssetDatabase.GUIDToAssetPath(guid);//path:(D:Project/Test/Assets/Scenes/Main.unity)string path = headPath + source;array.Add(path);}}else{Debug.LogError("No Find Source Path");}}#region Prefab優(yōu)化public static List<string> optimizePrefabsList;[MenuItem("Tools/預(yù)設(shè)優(yōu)化")]public static void OptimizePrefabs(){optimizePrefabsList = new List<string>();string headPath = Application.dataPath;headPath = headPath.Substring(0, headPath.IndexOf("Assets"));Debug.Log(headPath);try{AddRootSourcePathToList("Assets/CurPrefabs", headPath,"Prefab",ref optimizePrefabsList);}catch (System.Exception e){Debug.LogError(e);}Debug.Log("optimizePrefabsList:" + optimizePrefabsList.Count);for (int i = 0; i < optimizePrefabsList.Count; i++){Debug.Log(optimizePrefabsList[i]);EditorUtility.DisplayCancelableProgressBar("Prefabs Optimizing Bar", "Save And Optimize Prefabs" + i + "/" + optimizePrefabsList.Count, (float)i / optimizePrefabsList.Count);//tempPath(eg:Assets/Prefabs/Cube.prefab)string tempPath = optimizePrefabsList[i].Substring(headPath.Length);//根據(jù)路徑找到對(duì)象GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>(tempPath);//Debug.Log(tempPath);//Debug.Log(prefab.name);OptimizePrefabRemoveAudioListener(prefab);}EditorUtility.ClearProgressBar();Debug.Log("finished");}public static void OptimizePrefabRemoveAudioListener(GameObject prefab){AudioListener[] audios = prefab.GetComponentsInChildren<AudioListener>();Debug.Log(audios.Length);for (int i = 0; i < audios.Length; i++){Debug.Log(audios[i].name);DestroyImmediate(audios[i].GetComponent<AudioListener>(),true);}}#endregion }下面分析Editor中的問題:
1,Unity中的Editor的基礎(chǔ)篇:
Unity Editor 基礎(chǔ)篇(十一):MenuItem屬性_鱷魚淚的博客-CSDN博客_menuitem屬性
2,Unity編輯器不用實(shí)例化Prefab獲取,刪除,更新組件:
Unity3D研究院編輯器之不實(shí)例化Prefab獲取刪除更新組件(十五) | 雨松MOMO程序研究院
3,根據(jù)對(duì)象名字,標(biāo)簽或者類型查找某一個(gè)文件夾中所有對(duì)象的路徑
AssetDatabase-FindAssets的解析:AssetDatabase-FindAssets_京畿小李_新浪博客
4,游戲運(yùn)行的時(shí)候?qū)?chǎng)景中對(duì)象的修改,通過代碼控制保存的方法
[Unity]保存運(yùn)行時(shí)對(duì)Scene中GameObject屬性的修改_tlrainty的專欄-CSDN博客_unity運(yùn)行時(shí)保存場(chǎng)景文件
5,腳本自動(dòng)定位選擇Hierarchy或Project下的對(duì)象
[UnityEditor基礎(chǔ)]腳本自動(dòng)定位選擇Hierarchy或Project下的對(duì)象_鱷魚淚的博客-CSDN博客
6,Unity編輯器擴(kuò)展(自動(dòng)保存當(dāng)前打開的場(chǎng)景)
https://blog.csdn.net/crazyape/article/details/78803549
7,移除某個(gè)對(duì)象身上綁定的組件:
DestroyImmediate(audios[i].GetComponent<AudioListener>());
為了安全起見,我們移除的時(shí)候要添加一個(gè)參數(shù):
對(duì)于Prefab身上的組件我們不能用DestroyImmediate(audios[i].GetComponent<AudioListener>());
方法,會(huì)報(bào)錯(cuò)。用DestroyImmediate(audios[i].GetComponent<AudioListener>(), true);方法
總結(jié)
以上是生活随笔為你收集整理的Unity编辑器(Editor)的问题全解以及使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: database link问题解决
- 下一篇: 优秀的linux学习网站