You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Unity多材质对象修改材质无效果,出现Material (Instance)如何解决

解决Unity多材质修改不生效的问题

嘿,我明白你遇到的问题了——当对象有多个材质时,直接修改materials数组的单个元素确实不会生效,还会出现那个烦人的“Material (Instance)”提示,这其实是Unity的材质系统在搞事情。

问题根源

当你访问Renderer.materials的时候,Unity会自动为当前对象创建材质实例的副本(这就是“Instance”提示的由来),但你直接修改数组里的某个元素时,这个修改只停留在临时的副本数组里,并没有同步回Renderer组件,所以对象材质没变化。

正确的修改方法

你需要先把材质数组完整取出来,修改完所有元素后,再重新赋值给Renderer.materials,这样Unity才会应用你的修改。代码示例如下:

// 获取Renderer组件
Renderer objRenderer = GetComponent<Renderer>();
// 取出当前材质数组的副本
Material[] updatedMaterials = objRenderer.materials;

// 遍历所有材质槽,替换成目标材质
for (int idx = 0; idx < updatedMaterials.Length; idx++)
{
    updatedMaterials[idx] = customMaterial[i];
}

// 将修改后的数组重新赋值给Renderer
objRenderer.materials = updatedMaterials;

额外说明:共享材质 vs 实例材质

如果你希望修改的材质能影响所有使用该原始材质的对象(而不是只给当前对象创建实例),可以用sharedMaterials代替materials,代码逻辑是一样的:

Renderer objRenderer = GetComponent<Renderer>();
Material[] updatedSharedMaterials = objRenderer.sharedMaterials;

for (int idx = 0; idx < updatedSharedMaterials.Length; idx++)
{
    updatedSharedMaterials[idx] = customMaterial[i];
}

objRenderer.sharedMaterials = updatedSharedMaterials;

注意:使用sharedMaterials会直接修改原始材质资源,所有引用这个材质的对象都会跟着变化,如果你只是想单独修改当前对象,还是用materials更稳妥。

内容的提问来源于stack exchange,提问作者Yaroslav

火山引擎 最新活动