1. 程式人生 > >Unity Editor 檢查工程Prefab(預設)中的空組件

Unity Editor 檢查工程Prefab(預設)中的空組件

com game filepath ddr bug str 技術 程序 string

在我們做項目的過程中 經常會有預設中出現空的腳本

例如:

技術分享

導致的原因是因為 腳本的丟失

現在我們來做一個檢查工程中有空腳本的預設工具

老規矩直接上代碼 放到工程就能用

using UnityEngine;
using UnityEditor;
using System.IO;
using System.Collections.Generic;

public class PrefabTool : EditorWindow
{
    [MenuItem("Prefab Tool/Check Missing Scripts")]
    static void CheckMissingScripts()
    {
        List
<string> listString = new List<string>(); CollectFiles(Application.dataPath, listString); for (int i = 0; i < listString.Count; i++) { string Path = listString[i]; float progressBar = (float)i / listString.Count; EditorUtility.DisplayProgressBar(
"Check Missing Scripts", "The progress of : " + ((int)(progressBar * 100)).ToString() + "%", progressBar); if (!Path.EndsWith(".prefab"))//只處理prefab文件 { continue; } Path = ChangeFilePath(Path); AssetImporter tmpAssetImport = AssetImporter.GetAtPath(Path); GameObject prefab
= AssetDatabase.LoadAssetAtPath<GameObject>(tmpAssetImport.assetPath); if (prefab == null) { Debug.LogError("空的預設 : " + tmpAssetImport.assetPath); continue; } Transform[] transforms = prefab.GetComponentsInChildren<Transform>(); //獲取所有的子節點; for (int j = 0; j < transforms.Length; j++) { GameObject obj = transforms[j].gameObject; var components = obj.GetComponents<Component>(); //獲取對象所有的Component組件 //所有繼承MonoBehaviour的腳本都繼承Component for (int k = 0; k < components.Length; k++) { if (components[k] == null) { Debug.LogError("這個預制中有空的腳本 :" + tmpAssetImport.assetPath + " 掛在對象 : " + obj.name + ""); } } } } EditorUtility.ClearProgressBar(); } //改變路徑 //這種格式的路徑 "C:/Users/XX/Desktop/aaa/New Unity Project/Assets\a.prefab" 改變成 "Assets/a.prefab" static string ChangeFilePath(string path) { path = path.Replace("\\", "/"); path = path.Replace(Application.dataPath + "/", ""); path = "Assets/" + path; return path; } //叠代獲取文件路徑; static void CollectFiles(string directory, List<string> outfiles) { string[] files = Directory.GetFiles(directory); outfiles.AddRange(files); string[] childDirectories = Directory.GetDirectories(directory); if (childDirectories != null && childDirectories.Length > 0) { for (int i = 0; i < childDirectories.Length; i++) { string dir = childDirectories[i]; if (string.IsNullOrEmpty(dir)) continue; CollectFiles(dir, outfiles); } } } }

參考 Unity3D研究院編輯器之不實例化Prefab獲取刪除更新組件(十五) | 雨松MOMO程序研究院

鏈接:http://www.xuanyusong.com/archives/3727

這篇博客裏面那個刪除空腳本的方法 我測試 發現有問題 並不能用!

Unity Editor 檢查工程Prefab(預設)中的空組件