Экземпляр материала, созданный в сборной модели автомобиля - PullRequest
0 голосов
/ 28 мая 2019

Я не знаю, почему рендерер сеток 3d-модели моей машины создает собственные экземпляры всех материалов, когда я порождаю их, используя prefab. Пожалуйста, проверьте изображение ниже для того же: enter image description here

Мои модели окружения не создают собственные экземпляры материалов, но все модели автомобилей делают, когда я инициализирую через prefab. Я надеюсь, что вы поняли мою точку зрения.

Здесь я прилагаю изображение для настроек импорта модели автомобиля: enter image description here

Итак, я хочу остановить процесс создания новых экземпляров материалов

После появления модели автомобиля во время выполнения создается собственный экземпляр материала, поэтому я хочу решить эту проблему.

Я создал еще один демонстрационный проект, в котором такого рода ситуации не создаются. В рендере сетки не создается новый экземпляр материала.

Ответы [ 2 ]

0 голосов
/ 01 июня 2019

Наконец-то я могу справиться с проблемой самостоятельно.

Как я понимаю и узнаю, если вы измените какое-либо свойство материала, скажем, в соответствии с моим случаем, на Color, то он создаст новый его экземпляр, потому что вы изменили что-то во время выполнения по сравнению с его базовой версией.

В моем случае я хочу изменить время исполнения цвета шасси автомобиля в зависимости от выбора игрока. Чтобы новые экземпляры материала создавались во время выполнения, и я потерял доступ к материалу шасси, чтобы изменить цвет.

Мне требуется во время выполнения выбрать материал шасси, чтобы изменить его цвет. Вот код, который я использовал:

GetCarChassisMaterial().color = DataCollection.CAR_COLOR_OPTIONS[colorIndex];

Material GetCarChassisMaterial()
{
    Material[] carSharedMats = carChassisMeshRenderers[currentCarIndex].sharedMaterials;
    for (int i = 0; i < carSharedMats.Length; i++)
    {
        if (RemoveInstanceFromName(carSharedMats[i].name).Equals(carsChasisMat[currentCarIndex].name))
            return carSharedMats[i];
    }

    return carsChasisMat[currentCarIndex];
}

// remove "(Instance)" word from runtime created material name
private string RemoveInstanceFromName(string name)
{
    return name.Split(new char[] { ' ' })[0];
}
0 голосов
/ 28 мая 2019

Когда вы получаете доступ к материалу рендерера через код и что-то изменяете, Unity дублирует ваш материал (экземпляр, который вы видите), чтобы он не изменял все объекты, которые разделяют этот материал.Если вы хотите что-то изменить глобально, либо получите ссылку на материал (не проходя через средство визуализации), либо создайте несколько материалов и назначьте тот, который вы хотите во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...