using System.Collections; using System.Collections.Generic; using System.IO; using UnityEditor; using UnityEngine; public class EditorUtilities : MonoBehaviour { [MenuItem("GameObject/去除无效脚本", false, -100)] //设置在右键上显示 //[MenuItem("Assets/去除无效脚本", false, -100)] static void CleanupMissingScripts() { //使用方法 选择物体,右键--去除无效脚本即可, for (int i = 0; i < Selection.gameObjects.Length; i++) { //删除当前选择的物体以及子物体、孙子物体等所有物体身上的空脚本 var gameObject = Selection.gameObjects[i]; GameObjectUtility.RemoveMonoBehavioursWithMissingScript(gameObject); Transform[] transforms = gameObject.GetComponentsInChildren(true); for (int j = 0; j < transforms.Length; j++) { GameObjectUtility.RemoveMonoBehavioursWithMissingScript(transforms[j].gameObject); } } } [MenuItem("Assets/一键生成动画片段", false, 1)] static void CreateAnimFromFBX() { UnityEngine.Object[] gameObjects = Selection.objects; string[] strs = Selection.assetGUIDs; if (gameObjects.Length > 0) { int gameNum = gameObjects.Length; for(int i = 0; i < gameNum; i++) { string fbxName = gameObjects[i].name; string assetPath = AssetDatabase.GUIDToAssetPath(strs[i]); //Debug.Log(assetPath); //具体到fbx的路径 string animFolder = Path.GetDirectoryName(assetPath) + "/Anim"; // 如果不存在该文件夹则创建一个新的 if (!AssetDatabase.IsValidFolder(animFolder)) { AssetDatabase.CreateFolder(Path.GetDirectoryName(assetPath), "Anim"); } // 获取assetPath下所有资源 Object[] assets = AssetDatabase.LoadAllAssetsAtPath(assetPath); bool isCreate = false; List animation_clip_list = new List(); foreach (Object item in assets) { if (typeof(AnimationClip) == item?.GetType())//找到fbx里面的动画 { Debug.Log("找到动画片段:" + item); if(!item.name.StartsWith("__preview")){ animation_clip_list.Add(item); } } } foreach(AnimationClip animation_clip in animation_clip_list){ Object new_animation_clip = new AnimationClip(); EditorUtility.CopySerialized(animation_clip, new_animation_clip); new_animation_clip.name = Path.GetFileNameWithoutExtension(assetPath); string animation_path = Path.Combine(animFolder, new_animation_clip.name + ".anim"); Debug.Log(animation_path); AssetDatabase.CreateAsset(new_animation_clip, animation_path); isCreate = true; } //AssetDatabase.DeleteAsset(assetPath); AssetDatabase.Refresh(); if (isCreate) Debug.Log("自动创建动画片段成功:" + animFolder); else Debug.Log("未自动创建动画片段。"); } } else { Debug.LogError("请选中需要一键提取动画片段的模型"); } } }