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

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

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

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

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

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

-1
Siddharth 28 Май 2019 в 15:05

2 ответа

Лучший ответ

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

Как я понимаю и узнаю, если вы измените какое-либо свойство материала, скажем, в соответствии с моим случаем, 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
Siddharth 1 Июн 2019 в 17:18

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

0
Jichael 28 Май 2019 в 13:41