Как исправить этот скрипт Unity с ошибкой MissingReferenceException?C#

Место общения программистов C#
Ответить
Anonymous
 Как исправить этот скрипт Unity с ошибкой MissingReferenceException?

Сообщение Anonymous »


Скрипт выполняет следующие задачи.
[*]
Создает новый материал
[*]
Назначьте текстуры новому материалу из Assets/Textures/{model_name}/
[*]
Сохраните новый материал в Assets/Materials/{model_name}/{model_name}.mat
[*]
Назначьте новый материал импортирующей модели.
[*]
Добавляет компонент MeshCollider и отключает MeshRenderer для объектов, которые содержат collider в дочернем имени импортирующего объекта.

с использованием UnityEngine; использование UnityEditor; использование System.IO; Импортер открытого класса: AssetPostprocessor { // Определить objTransform на уровне класса частное преобразование objTransform; частный Преобразование материалаTransform; void OnPostprocessModel (объект GameObject) { // Сохраняем преобразование GameObject objTransform = obj.transform; // Присвоение значения objTransform материалуTransform материалTransform = objTransform; // Создаем новый материал Материал newMaterial = новый Материал(Shader.Find("Стандарт")); // Загружаем все текстуры из папки модели в папку «текстуры» string[]textureFiles = Directory.GetFiles(Path.Combine("Assets/Textures", obj.name), "*.png"); foreach (строка текстуры в файле текстуры) { // Получаем имя файла без расширения строка имя текстуры = Path.GetFileNameWithoutExtension(textureFile); // Загружаем текстуру Текстура Texture2D = AssetDatabase.LoadAssetAtPath(textureFile); // Разделяем имя текстуры на части string[] parts = имятекстуры.Split('_'); // Проверяем, содержит ли имя текстуры имя объекта if (parts.Length > 2 && parts[0] == obj.name) { // Получаем тип текстуры тип строки = части [2]; // Назначаем текстуру соответствующему слоту в материале if (тип == "Альбедо") { newMaterial.SetTexture("_MainTex", текстура); } иначе if (тип == "Металлик") { newMaterial.SetTexture("_MetallicGlossMap", текстура); } иначе если (тип == "Нормальный" || тип == "НормальныйGL") { newMaterial.SetTexture("_BumpMap", текстура); } иначе если (тип == "Высота") { newMaterial.SetTexture("_ParallaxMap", текстура); } иначе если (тип == "Окклюзия") { newMaterial.SetTexture("_OcclusionMap", текстура); } иначе если (тип == "Выброс") { newMaterial.EnableKeyword("_EMISSION"); newMaterial.globalIlluminationFlags = MaterialGlobalIlluminationFlags.BakedEmissive; newMaterial.SetTexture("_EmissionMap", текстура); } } } string MaterialDirectory = Path.Combine("Активы/Материалы", obj.name); // Проверяем, существует ли каталог, если нет, создаем его если (!Directory.Exists(materialDirectory)) { Directory.CreateDirectory(materialDirectory); } // Сохраняем имя объекта строка имя_объекта = имя_объекта; // Применяем компонент коллайдера к модели ApplyCollider(objTransform); // Откладываем создание актива до завершения процесса импорта EditorApplication.delayCall += () => { // Используем имя сохраненного объекта string MaterialDirectory = Path.Combine("Активы/Материалы", objName); // Проверяем, существует ли каталог, если нет, создаем его если (!Directory.Exists(materialDirectory)) { Directory.CreateDirectory(materialDirectory); } // Сохраняем материал в файл AssetDatabase.CreateAsset(newMaterial, Path.Combine(materialDirectory, objName + ".mat")); // Обновляем базу данных AssetDatabase, чтобы убедиться, что новый материал появился в редакторе БазаДанныхАссетов.Обновить(); // Применяем новый материал к модели и ее дочерним элементам ApplyMaterial(materialTransform, newMaterial); }; } void ApplyCollider (преобразование объекта) { if (obj.name.ToLower().Contains("коллайдер")) obj.gameObject.AddComponent(); foreach (преобразование дочернего элемента в obj) { if (child.name.ToLower().Contains("коллайдер")) { child.GetComponent().enabled = false; ApplyCollider (дочерний); } еще { ApplyCollider (дочерний); } } } void ApplyMaterial (Transform obj, Material newMaterial) { // Устанавливаем материал для компонента MeshRenderer, если он существует MeshRenderer meshRenderer = obj.GetComponent(); если (meshRenderer != ноль) { meshRenderer.material = новыйМатериал; } foreach (преобразование дочернего элемента в obj) { if (child.name.ToLower().Contains("LOD")) { ApplyMaterial(дочерний, новыйМатериал); } еще { ApplyMaterial(дочерний, новыйМатериал); } } } } Но я получаю эту ошибку.

MissingReferenceException: объект типа «Преобразование» был уничтожен, но вы все еще пытаетесь получить к нему доступ. Ваш скрипт должен либо проверить, является ли он нулевым, либо вам не следует уничтожать объект.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»