Редактор Unity3D: Как я могу найти все способы использования данного ресурса?

#unity3d #assets #unity3d-editor

#unity3d #ресурсы #unity3d-editor

Вопрос:

Очень полезная функция «Найти способы использования» существует в Visual Studio и Resharper, но я не могу найти то же самое в редакторе Unity3D. Я вижу только «Выбрать зависимости» в Unity3d, но мне нужен противоположный вариант. Существует ли он?

Ответ №1:

В редакторе перейдите на вкладку Проекта, выберите данный ресурс, щелкните по нему правой кнопкой мыши, а затем выберите Найти ссылки в сцене. Он покажет вам каждый GameObject, к которому данный ресурс прикреплен в представлении иерархии, если данный ресурс является скриптом. Если это изображение, аудиофайл или сборный файл, он покажет вам, какой GameObject использует этот ресурс в иерархическом представлении.

введите описание изображения здесь

Комментарии:

1. Привет, программист, большое спасибо за быстрый и подробный ответ, даже с графикой! Это довольно полезно, но (с моей точки зрения) для не очень больших проектов, только с одной или несколькими сценами. В любом случае, это намного лучше, чем ничего.))

2. Под большими проектами я подразумеваю, что выбор, который я получаю при использовании поиска вариантов использования в сцене, не очень полезен, когда у вас более 3 вариантов использования. Кроме того, он не позволяет выполнять поиск по проекту, как это делает Select Dependencies, поэтому, извините, это не полностью решает мою проблему.

3. Это нормально. Удачного кодирования!

4. При щелчке правой кнопкой мыши на объекте опция «Найти ссылку в сцене» не существует. Есть только «Найти ссылки в сцене»

5. У меня уже некоторое время это не работает:/ issuetracker.unity3d.com/issues /…

Ответ №2:

Бесплатный инструмент с открытым исходным кодом Dependencies-Hunter выполняет эту работу: находит все зависимости / способы использования данного ресурса (ов). Он также может выполнить полный анализ проекта, чтобы найти там все неиспользуемые ресурсы.

Он состоит из одного скрипта, поэтому его легко скопировать и вставить в ваш проект.

Внутренне он использует AssetDatabase.GetDependencies для построения карты всех ресурсов для использования в анализе.

Итак, у него есть два варианта использования:

  • в контекстном меню ресурса добавлена опция «Найти ссылки в проекте», которая показывает, какие зависимости имеет этот конкретный ресурс. Результирующее окно выглядит следующим образом
  • существует также возможность найти все неиспользуемые ресурсы в проекте через отдельное окно редактора. Вы можете фильтровать ресурсы для анализа, указывая шаблоны регулярных выражений, которые следует игнорировать.

Комментарии:

1. Просто добавьте "unity-dependencies-hunter": "https://github.com/AlexeyPerov/Unity-Dependencies-Hunter.git#upm" в свой manifest.json файл в Packages/ , и в моем случае Unity автоматически загрузила пакет после сохранения.

Ответ №3:

К сожалению, редактор Unity позволяет находить варианты использования ресурса только в сцене.

  • Более того, вы получаете выбранный список ресурсов, использующих его, поэтому после изменения фокуса мыши вы потеряете свой выбор

В хранилище ресурсов есть решение, которое делает:

  • Найти все способы использования ресурса как в проекте, так и в режиме просмотра сцены
  • Продемонстрируйте результаты в отдельном окне, показывая конкретные поля, в которых используется целевой ресурс
  • Позволяет заменять определенные способы использования ресурса перетаскиванием

GIF, демонстрирующий функции и интерфейс:

Ссылка на хранилище ресурсов:

Комментарии:

1. Я думаю, это то, что я искал. Спасибо!

2. Есть ли какие-либо планы по поддержке Unity 2018.3 и Unity 2019?

3. Обновленная ссылка (потому что я не могу отредактировать ответ): assetstore.unity.com/packages/tools/utilities /…

Ответ №4:

В Unity Answers есть этот скрипт, который довольно хорошо справляется с этим. (Также может быть легко слегка изменен для улучшения его функциональности)

Источник: http://answers.unity.com/answers/1509032/view.html

 using System.Collections.Generic;
 using UnityEngine;
 using System.Linq;
 #if UNITY_EDITOR
 using UnityEditor;
 public class BacktraceReference : EditorWindow
 {
     /// <summary> The result </summary>
     public static List<Component> ReferencingSelection = new List<Component>();
     /// <summary> allComponents in the scene that will be searched to see if they contain the reference </summary>
     private static Component[] allComponents;
     /// <summary> Selection of gameobjects the user made </summary>
     private static GameObject[] selections;
     /// <summary>
     /// Adds context menu to hierarchy window https://answers.unity.com/questions/22947/adding-to-the-context-menu-of-the-hierarchy-tab.html
     /// </summary>
     [UnityEditor.MenuItem("GameObject/Find Objects Referencing This", false, 48)]
     public static void InitHierarchy()
     {
         selections = UnityEditor.Selection.gameObjects;
         BacktraceSelection(selections);
         GetWindow(typeof(BacktraceReference));
     }
     /// <summary>
     /// Display referenced by components in window
     /// </summary>
     public void OnGUI()
     {
         if (selections == null || selections.Length < 1)
         {
             GUILayout.Label("Select source object/s from scene Hierarchy panel.");
             return;
         }
         // display reference that is being checked
         GUILayout.Label(string.Join(", ", selections.Where(go => go != null).Select(go => go.name).ToArray()));
         // handle no references
         if (ReferencingSelection == null || ReferencingSelection.Count == 0)
         {
             GUILayout.Label("is not referenced by any gameobjects in the scene");
             return;
         }
         // display list of references using their component name as the label
         foreach (var item in ReferencingSelection)
         {
             EditorGUILayout.ObjectField(item.GetType().ToString(), item, typeof(GameObject), allowSceneObjects: true);
         }
     }
     // This script finds all objects in scene
     private static Component[] GetAllActiveInScene()
     {
         // Use new version of Resources.FindObjectsOfTypeAll(typeof(Component)) as per https://forum.unity.com/threads/editorscript-how-to-get-all-gameobjects-in-scene.224524/
         var rootObjects = UnityEngine.SceneManagement.SceneManager
             .GetActiveScene()
             .GetRootGameObjects();
         List<Component> result = new List<Component>();
         foreach (var rootObject in rootObjects)
         {
             result.AddRange(rootObject.GetComponentsInChildren<Component>());
         }
         return result.ToArray();
     }
     private static void BacktraceSelection(GameObject[] selections)
     {
         if (selections == null || selections.Length < 1)
             return;
         allComponents = GetAllActiveInScene();
         if (allComponents == null) return;
         ReferencingSelection.Clear();
         foreach (GameObject selection in selections)
         {
             foreach (Component cOfSelection in selection.GetComponents(typeof(Component)))
             {
                 FindObjectsReferencing(cOfSelection);
             }
         }
     }
     private static void FindObjectsReferencing<T>(T cOfSelection) where T : Component
     {
         foreach (Component sceneComponent in allComponents)
         {
             componentReferences(sceneComponent, cOfSelection);
         }
     }
     /// <summary>
     /// Determines if the component makes any references to the second "references" component in any of its inspector fields
     /// </summary>
     private static void componentReferences(Component component, Component references)
     {
         // find all fields exposed in the editor as per https://answers.unity.com/questions/1333022/how-to-get-every-public-variables-from-a-script-in.html
         SerializedObject serObj = new SerializedObject(component);
         SerializedProperty prop = serObj.GetIterator();
         while (prop.NextVisible(true))
         {
             bool isObjectField = prop.propertyType == SerializedPropertyType.ObjectReference amp;amp; prop.objectReferenceValue != null;
             if (isObjectField amp;amp; prop.objectReferenceValue == references)
             {
                 ReferencingSelection.Add(component);
             }
         }
     }
 }
 #endif
  

Комментарии:

1. Спасибо, что включили ссылку на источник! в нем есть несколько интересных комментариев.

Ответ №5:

Приведенные выше решения на самом деле неверны. Unity поддерживает поиск ссылок на ресурс в project view, но для этого нет кнопки. Вы должны ввести запрос вручную в строку поиска project view: «ref:Assets //» с расширением файла. Это точно такой же запрос, который он вводит в поиск в режиме просмотра сцены, когда вы ищете ссылки в сцене. Unity требуется некоторое время, чтобы «подумать», но в конечном итоге он выдаст ссылки на ваш ресурс / скрипт.