gpt4 book ai didi

c# - 如何替换 MeshRenderer.sharedMaterials 中的元素

转载 作者:太空宇宙 更新时间:2023-11-03 19:39:28 24 4
gpt4 key购买 nike

我们正在使用 Assets 商店中的一个对象,该对象使用了一个包含 32 种 Material 的网格渲染器。我们需要实现能够替换列表中的一种 Material 并保留其余 Material 的功能。

我已经尝试了几种方法,但我一直在为 Material list 而苦苦挣扎,这就是为什么我决定向你们寻求帮助。

public Material TestMaterial;

void Update()
{
for (int i = 0; i < meshRenderer.sharedMaterials.Length; i++)
{
if (meshRenderer.sharedMaterials[i].name == "replaceableMat")
{
// Replace with TestMaterial
}
}
}

上面的代码是我有点想使用它的方式。

TestMaterial 对象不为空,它是从 Unity 编辑器中选择的,所以没问题。

有人可以给我一些见解吗?

谢谢转发!

最佳答案

来自 Renderer.sharedMaterials :

Note that like all arrays returned by Unity, this returns a copy of materials array. If you want to change some materials in it, get the value, change an entry and set materials back.


你必须完全做到这一点。将 Material 存储在临时变量中,更改条目并在完成后将整个数组写回 sharedMaterials:

var materials = meshRenderer.sharedMaterials;
for(int i = 0; i < materials.Length; i++)
{
if(!string.Equals(materials[i].name, "replaceableMat") continue;

materials[i] = TestMaterial;
}
meshRenderer.sharedMaterials = materials;

背后的原因是 sharedMaterials 不是一个字段,而是一个属性

由于 sharedMaterial[i] 的赋值不是对整个属性的赋值,它所做的只是替换临时数组中的条目,而不是实际将其赋值回 Renderer 组件。

只有为整个属性赋值才能真正使属性执行它的 setter 并将数组写回 Renderer 组件。

关于c# - 如何替换 MeshRenderer.sharedMaterials 中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55849541/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com