国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Unity 編輯器-查找所有未被使用的Prefab

這篇具有很好參考價值的文章主要介紹了Unity 編輯器-查找所有未被使用的Prefab。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

需求

接到一個需求,將Res里所有特效相關的prefab檢查一下,沒有使用的移除。

分析

先拆解一下需求,如下

代碼
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEngine;
using UnityEditor;
using Object = UnityEngine.Object;

public class SearchUseing :EditorWindow
{
    
    private Vector2 _pos = Vector2.zero;
    static string[] fileExtensions = { ".cs", ".js", ".txt" };//你查詢的文件格式 如 .json 等
    private static List<Object> _objs = new List<Object>();
    private static Dictionary<string, List<string>>  _referenceCache = new Dictionary<string, List<string>>();
    private static Dictionary<string, Object> _allUnUsedDic = new Dictionary<string, Object>();

    private static Dictionary<string, List<string>> _resultDic = new Dictionary<string, List<string>>();
    private  static void ShowWindow()
    {
        var window = (SearchUseing)EditorWindow.GetWindow(typeof(SearchUseing));
        window.titleContent = new GUIContent("Object List");
        window.Show();
    }

    private void OnGUI()
    {
        // 在 EditorWindow 中使用 GUILayout 繪制 UI 元素
        GUILayout.BeginHorizontal();
        GUILayout.Label("選中的Asset列表", EditorStyles.boldLabel);

        if (GUILayout.Button("導出空引用的文件路徑"))
        {
            string selectedFolderPath = AssetDatabase.GUIDToAssetPath(Selection.assetGUIDs[0]);
            string folderName = System.IO.Path.GetFileName(selectedFolderPath);
            Output(_resultDic,folderName,true);
        }
        if (GUILayout.Button("導出所有文件及依賴路徑"))
        {
            string selectedFolderPath = AssetDatabase.GUIDToAssetPath(Selection.assetGUIDs[0]);
            string folderName = System.IO.Path.GetFileName(selectedFolderPath);
            Output(_resultDic,folderName,false);
        }
        if (GUILayout.Button("移動空引用prefab"))
        {
            MoveAll();
        }
        GUILayout.EndHorizontal();
        Rect rect = new Rect(10, 20, position.width - 20, position.height - 30);
        GUILayout.BeginArea(rect);
        if (_allUnUsedDic is { Count: > 0 })
        {
            _pos = GUILayout.BeginScrollView(_pos);
            foreach (var kv in _resultDic)
            {
                EditorGUILayout.ObjectField(AssetDatabase.LoadMainAssetAtPath(kv.Key), typeof(Object), false);
                foreach (var s in kv.Value)
                {
                    EditorGUILayout.ObjectField(AssetDatabase.LoadMainAssetAtPath(s), typeof(Object), false);
                }
                GUILayout.Space(20);
            }

            GUILayout.EndScrollView();
        }
        GUILayout.EndArea();
        
    }
    [MenuItem("Assets/工具/查找空引用的Prefab")]
    public static void SearchAll()
    {
        _resultDic = new Dictionary<string, List<string>>();
        GetAllDependency();
        foreach (var folderPath in Selection.GetFiltered(typeof(DefaultAsset), SelectionMode.Assets))
        {
            var assetPath = AssetDatabase.GetAssetPath(folderPath);
            var assets = AssetDatabase.FindAssets("t:Prefab", new[] { assetPath });
            foreach (var asset in assets)
            {
                var assetFilePath = AssetDatabase.GUIDToAssetPath(asset);
                _resultDic.Add(assetFilePath,new List<string>());
                ReferenceFilter(assetFilePath);
                _allUnUsedDic.TryAdd(assetFilePath,AssetDatabase.LoadMainAssetAtPath(assetFilePath));
            }
        }

        SearchInAssets(_allUnUsedDic);
        if (_resultDic is { Count: > 0 })
        {
            ShowWindow();
        }
        
    }
    //導出顯示結果的txt文件
    private static void Output(Dictionary<string,List<string>> dic,string fileName,bool isNull)
    {
        string filePath = $"temporaryCacheRes/Dic_{fileName}{(isNull ? "1" : "2")}.txt"; // 文件保存路徑,可以自己指定

        using (StreamWriter streamWriter = new StreamWriter(filePath))
        {
            foreach (KeyValuePair<string, List<string>> kvp in dic)
            {
                if (isNull&&kvp.Value.Count == 0 || !isNull)
                {
                    streamWriter.WriteLine(kvp.Key); // 寫入Key值

                    List<string> items = kvp.Value; 
                    foreach (string item in items)
                    {
                        streamWriter.WriteLine("\t" + item); // 寫入Value值,使用tab鍵縮進
                    }
                    streamWriter.WriteLine("\n" ); 
                }
            }
            AssetDatabase.Refresh();
        }
    }
    private static void GetAllDependency()
    {
        _referenceCache = new Dictionary<string, List<string>>();
        _allUnUsedDic = new Dictionary<string, Object>();
        _objs = new List<Object>();
        var guids = AssetDatabase.FindAssets("");
        foreach (var guid in guids)
        {
            var assetPath = AssetDatabase.GUIDToAssetPath(guid);
            var dependencies = AssetDatabase.GetDependencies(assetPath, false);

            foreach (var dependency in dependencies)
            {
                if (_referenceCache.ContainsKey(dependency))
                {
                    if (!_referenceCache[dependency].Contains(assetPath))
                    {
                        _referenceCache[dependency].Add(assetPath);
                    }
                }
                else
                {
                    _referenceCache[dependency] = new List<string>() { assetPath };
                }
            }
        }
    }
    private static void ReferenceFilter(string path)
    {
        if (_referenceCache.ContainsKey(path))
        {
            foreach (var reference in _referenceCache[path])
            {
                Debug.Log(reference, AssetDatabase.LoadMainAssetAtPath(reference));
                var prefabObj = AssetDatabase.LoadAssetAtPath<Object>(reference);
                if (!_objs.Contains(prefabObj))
                {
                    _objs.Add(prefabObj);
                }
            }

            _resultDic[path] = _referenceCache[path];
        }
        else
        {
            _allUnUsedDic.TryAdd(path,AssetDatabase.LoadMainAssetAtPath(path));
            Debug.LogWarning($"{path}  沒有直接引用");
        }

    }
    
    private static void MoveAll()
    {
        foreach (var kv in _allUnUsedDic)
        {
            Debug.Log(kv.Value.name);
            MovePrefabToFolder(kv.Key, kv.Value.name);
            _resultDic.Remove(kv.Key);
        }
        AssetDatabase.Refresh();
    }
    
    //移動到指定路徑
    static void MovePrefabToFolder(string path,string prefabName)
    {
        string targetFolderPath = "Assets/Art/Effect/Temp/";
        CreateFolderIfNotExists("Assets/Art/Effect","Temp");
        if (!AssetDatabase.IsValidFolder(targetFolderPath))
        {
            Debug.LogWarning("Invalid folder path: " + targetFolderPath);
            return;
        }

        // 組裝新的Prefab路徑并移動到指定文件夾
       
        string newPrefabPath = targetFolderPath + prefabName + ".prefab";
        AssetDatabase.MoveAsset(path, newPrefabPath);
        AssetDatabase.SaveAssets();

        Debug.Log("Prefab " + prefabName+ " moved to " + newPrefabPath);
    }
    // public static void SerachInAssets()
    // {
    //     var path = AssetDatabase.GetAssetPath(Selection.activeObject);
    //     var obj = AssetDatabase.LoadMainAssetAtPath(path);
    //     Debug.Log(obj.name);
    //     // SearchInAssets(obj.name,path);
    //     // SearchInTxtFiles(obj.name);
    // }
    //在Assets文件夾中進行搜索
   static void SearchInAssets(Dictionary<string,Object> dic)
    {
        string[] paths = AssetDatabase.GetAllAssetPaths();

        foreach (string path in paths)
        {
            // if (!path.StartsWith("Assets/Game") && !path.StartsWith("Assets/Res/Table/effect"))
            // {
            //     continue;
            // }
            
            if (!path.StartsWith("Assets/Res/Table/effect"))  //寫你的篩選條件,比如我這里項目中不會直接使用字符串加載,只會在指定路徑下查配表文件
            {
                continue;
            }
            // if (path.StartsWith("Assets/StreamingAssets")||path.StartsWith("Assets/Temp"))
            // {
            //     continue;
            // }

            
            if (AssetDatabase.IsValidFolder(path))
            {
                continue;
            }

            if (IgnoreFile(Path.GetFileName(path)))
            {
                continue;
            }

            if (AssetDatabase.GetMainAssetTypeAtPath(path) == typeof(GameObject))
            {
                //如果是prefab 則不檢測(ReferenceFilter已經(jīng)檢測過prefab)
                continue;
            }
            string text = File.ReadAllText(path);
            List<string> tempRemoveList = new List<string>(); 
            foreach (var kv in dic)
            {
                if (_resultDic.ContainsKey(kv.Key))
                {
                    var tempList = _resultDic[kv.Key] ??= new List<string>();
                    var name = kv.Value.name;
                    if (text.Contains(name) && path!=kv.Key )
                    {
                        Debug.Log("Found text in asset: " + path );
                        tempList.Add(path);
                        _resultDic[kv.Key] = tempList;
                        tempRemoveList.Add(kv.Key);
                    }
                }
                else
                {
                    Debug.Log($"當前遍歷的路徑不在result內(nèi),查查為啥");
                }
                
               
            }
            foreach (var s in tempRemoveList)
            {
                _allUnUsedDic.Remove(s);
            }
        }
        Debug.Log("searchend");
    }
 
    //在txt文件中進行搜索
    static void SearchInTxtFiles(string searchText)
    {
        DirectoryInfo directory = new DirectoryInfo(Application.dataPath);

        FileInfo[] files = directory.GetFiles("*.*", SearchOption.AllDirectories).Where(
            f => fileExtensions.Contains(f.Extension.ToLower())).ToArray();

        foreach (FileInfo file in files)
        {
            string text = File.ReadAllText(file.FullName);

            if (text.Contains(searchText))
            {
                Debug.Log("Found text in txt file: " + file.FullName);
            }
        }

        Debug.Log("searchend");
    }

    static bool IgnoreFile(string fileName)
    {
        return fileName == "TextSearchEditor.cs";
    }
    private void OnDestroy()
    {
        _referenceCache.Clear();    
    }
    static void CreateFolderIfNotExists(string path,string name)
    {
        // 檢查文件夾是否存在
        if (!AssetDatabase.IsValidFolder(path+"/"+name))
        {
            // 創(chuàng)建文件夾
            AssetDatabase.CreateFolder(path, name);
            AssetDatabase.Refresh();
            Debug.Log("Folder Create at " + path+"/"+name);
        }
        else
        {
            Debug.Log("Folder already exists at " + path);
        }
    }
}

結果
Unity 編輯器-查找所有未被使用的Prefab,# 編輯器拓展,Unity,unity,編輯器,游戲引擎

結果如圖所示。每組元素第一個為查找的prefab,之后的是使用了該prefab的預設或配表。
如果一組元素只有一個對象,則這個prefab無引用。
頂部的按鈕為指定功能。
PS:使用Prefab名字做的檢測,未對同名Prefab做篩選判斷文章來源地址http://www.zghlxwxcb.cn/news/detail-562268.html

到了這里,關于Unity 編輯器-查找所有未被使用的Prefab的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • PyCharm安裝使用2023年教程,PyCharm與現(xiàn)流行所有編輯器對比。

    PyCharm安裝使用2023年教程,PyCharm與現(xiàn)流行所有編輯器對比。

    與PyCharm類似的功能和特性的集成開發(fā)環(huán)境(IDE)和代碼編輯器有以下幾種: Visual Studio Code(VS Code):由Microsoft開發(fā),VS Code是一個高度可定制和可擴展的代碼編輯器。它支持多種編程語言,包括Python,并提供眾多擴展以增強功能。 IntelliJ IDEA:PyCharm本身就是基于JetBrains開發(fā)的

    2024年02月14日
    瀏覽(31)
  • Unity XR新版動作編輯器的使用

    Unity XR新版動作編輯器的使用

    雙擊 XRI Default Input Actions 打開, XRI Head 為頭部跟蹤,獲取設備頭部攝像機與場景攝像機的位置跟蹤及更新; XRI LeftHand 為左手的位置跟蹤及更新,每幀更新一次,可以添加事件做觸感操作,可以根據(jù)獲取到手的位置信息從而進行操作,不需要經(jīng)過按鍵; XRI LeftHand Interaction 是

    2023年04月08日
    瀏覽(33)
  • 使用VSCode作為Unity的代碼編輯器

    使用VSCode作為Unity的代碼編輯器

    ????????????????Unity在選擇IDE 的時候其實也有很多選擇,在 Windows 上我會選擇 Visual Studio 或者是 VS Code ,在編程體驗上來講我更喜歡 Visual Studio 。但是在 Mac OS 可能 Visual Studio Mac 版本并非是一個靠譜的選擇,它和 Rider 一樣都過于笨重,編程體驗比較卡頓,于是我還是

    2024年02月08日
    瀏覽(28)
  • 從零開始入門創(chuàng)作游戲——Unity編輯器的使用

    從零開始入門創(chuàng)作游戲——Unity編輯器的使用

    還沒找到工作的我繼續(xù)瞎折騰中,上次搭建環(huán)境就花了我3天的時間 從零開始入門創(chuàng)作游戲——Unity3d的環(huán)境搭建_默哀d的博客-CSDN博客 接下來是根據(jù)油土鱉的視頻學習創(chuàng)作的一個小恐龍?zhí)螒?,直接上手做一次學得更多 https://www.youtube.com/watch?v=UdM9DEys-rI 選擇2D核心模板就可

    2024年02月05日
    瀏覽(32)
  • Unity使用VS編輯器打開項目失敗解決辦法

    Unity使用VS編輯器打開項目失敗解決辦法

    具體表現(xiàn)為:項目文件.sln無法打開,打開腳本文件后無法關聯(lián)到Unity編輯器 報錯信息可能不同,參考出錯表現(xiàn)即可 首先去清除有邏輯錯誤的代碼,先注釋掉,不然后面可能會無法自動生成解決方案 然后關閉Unity編輯器,找到項目文件夾,刪除我列出的文件 重新打開Unity,重

    2024年02月16日
    瀏覽(27)
  • 【Unity編輯器】使用AssetDatabase創(chuàng)建、刪、改、加載資源

    AssetDatabase是Unity編輯器環(huán)境下的一種API,主要用于在代碼中對項目中的資源進行管理和操作。注意:AssetDatabase的這些方法只能在Unity編輯器環(huán)境下運行,不能在構建后的游戲中使用。在游戲運行時,你需要使用其他資源加載方法,如Resources.Load、AssetBundle加載或者Addressables等。

    2024年01月21日
    瀏覽(33)
  • 記錄使用注入的方式為Unity編輯器實現(xiàn)擴展能力

    記錄使用注入的方式為Unity編輯器實現(xiàn)擴展能力

    使用場景 當前項目編輯器中不方便存放或者提交擴展代碼 相同的擴展功能需要在多個項目(編輯器)中使用 項目開發(fā)中,偶爾臨時需要使用一個功能,想隨時使用隨時卸載 設計思路 使用進程注入,將一個 c/c++ dll 注入到當前運行的unity編輯器中 使用 c/c++ dll 調(diào)用 mono 的函數(shù)接

    2024年02月15日
    瀏覽(41)
  • 《Linux操作系統(tǒng)編程》第九章 數(shù)據(jù)查找和篩選工具 : 了解流編輯器sed和報表生成器awk的簡單使用

    《Linux操作系統(tǒng)編程》第九章 數(shù)據(jù)查找和篩選工具 : 了解流編輯器sed和報表生成器awk的簡單使用

    ???? 博主 libin9iOak帶您 Go to New World.??? ?? 個人主頁——libin9iOak的博客?? ?? 《面試題大全》 文章圖文并茂??生動形象??簡單易學!歡迎大家來踩踩~?? ?? 《IDEA開發(fā)秘籍》學會IDEA常用操作,工作效率翻倍~?? ???? 希望本文能夠給您帶來一定的幫助??文章粗淺,敬

    2024年02月12日
    瀏覽(32)
  • Sprite Editor圖片編輯器的使用_unity基礎開發(fā)教程

    Sprite Editor圖片編輯器的使用_unity基礎開發(fā)教程

    SpriteEditor是Unity引擎中的一個工具,用于創(chuàng)建和編輯2D圖片。它提供了一系列功能,可以對圖片進行剪裁、切割、翻轉(zhuǎn)、旋轉(zhuǎn)、調(diào)整大小等操作,以及設置圖片的碰撞檢測形狀和渲染模式。 SpriteEditor可以幫助開發(fā)者將多張圖片合并成動畫精靈,并為每一幀設置播放時間和循環(huán)

    2024年02月01日
    瀏覽(23)
  • 【Unity】AVPro使用踩坑,編輯器模式使用視頻播放正常,打包后視頻無法播放的問題

    【Unity】AVPro使用踩坑,編輯器模式使用視頻播放正常,打包后視頻無法播放的問題

    這個主要是AVPro的坑 一般使用會直接Browse給取文件路徑,然后面板上面就能看到視頻文件的名字,這個方法在編輯器模式下播放是可以獲取到文件的,所以沒問題。 但是打包后路徑變化,拉取到的地址就不對了。 首先把視頻資源改存到StreamingAssets文件夾路徑下,然后路徑獲

    2024年02月16日
    瀏覽(164)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包