This tool finds all missing references in Unity Project and displays the results in a separate window.
Инструмент находит и выводит в отдельном окне missing ссылки во всех файлах каталога Assets проекта Unity. Открывает файлы сцен и префабов во время обработки, проверяя также все дочерние объекты. Для больших проектов обработка может занять длительное время. Пример "утерянной" ссылки:
- Скопировать и вставить MissingReferenceTool.cs в каталог вашего проекта;
- Убедиться что открытая сцена и префаб сохранены;
- Запустить инструмент через Tools/Find Missing References;
- Результат будет выведен в окне Missing References:
Запускается цикл по всем путям каталога Assets, загружаются компоненты корневых и дочерних объектов, и все их сериализованные свойства подвергаются следующим сравнениям:
SerializedProperty.objectReferenceValue == null && SerializedProperty.objectReferenceInstanceIDValue != 0Отличие missing и null ссылок в значении Instance ID. Если оно больше нуля, но сравнение с null возвращает true, значит ссылка является "утерянной". Для реализации использован этот способ, т.к. он является самым надежным и производительным из обнаруженных мной.
- Альтернативный способ получить значение Instance ID, но менее производительный, т.к. необходимо перебирать все свойства файла.
SerializedProperty.FindPropertyRelative("m_FileID")- При обращении к атрибуту потенциально утерянной ссылки возникает ошибка типа MissingReferenceException, которую можно обработать через try-catch. Недостаток этого метода в том, что ошибка возникает только при работе с классом GameObject, а missing ссылки могут встречаться и в других классах.
try
{
_ = property.name;
}
catch (MissingReferenceException)- При этом способе считывается содержимое каждого файла в целях найти GUID объекта. Отсутствие такого же идентификатора в коллекции гуидов проекта говорит об утерянности ссылки. При таком решении необходимо разбирать содержимое каждого файла, что излишне усложняет разработку.
AssetDatabase.GUIDFromAssetPath() <> DecodeGUID(File.ReadAllLines())
// DecodeGUID - абстрактный метод расшифровки- Поиск вхождения "Missing" в поле атрибута ссылочного типа. Решение эффективно, но не идеально. Текст поля не подразумевается как ключевой фактор "утерянности" ссылки.
using System.Reflection;
PropertyInfo objRefValueMethod = typeof(SerializedProperty).GetProperty(
"objectReferenceStringValue",
BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic
);
string objectReferenceStringValue = (string)objRefValueMethod
.GetGetMethod(true)
.Invoke(property, new object[] { });

