我不知道为什么我的3D模型的网格渲染器在使用预制生成时会创建所有材料的实例。 请检查下图是否相同:
我的环境模型不是创建自己的材料实例,而是所有通过预制进行初始化的汽车模型都在创建。 希望你明白我的意思。
所以我想停止这些新材料实例的创建过程
生成汽车模型后,它在运行时创建了自己的材质实例,因此我想解决此问题。
我创建了另一个演示项目,因为这种情况无法创建。在网格渲染器中没有新的材质实例创建。
答案 0 :(得分:0)
当您通过代码访问渲染器的材质并进行修改时,Unity复制您的材质(您正在查看的实例),以便它不会修改共享此材质的每个对象。如果要全局更改某些内容,请获取对材质的引用(不通过渲染器),或者创建多个材质并在运行时分配所需的材质。
答案 1 :(得分:0)
最后,我可以自己解决问题了。
据我了解和了解,如果您更改材料的任何属性,请按照我的情况说一种颜色,那么它将创建一个新实例,因为您更改了与运行时相比其核心版本的内容。
就我而言,我想根据玩家的选择来更改汽车底盘的颜色运行时间。 这样就可以创建新的材质实例运行时,而我却无法访问机箱材质以更改颜色。
我需要在运行时获取机箱的材料以更改其颜色。 这是我使用的代码:
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];
}