- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我们正在使用 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 编辑器中选择的,所以没问题。
有人可以给我一些见解吗?
谢谢转发!
最佳答案
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/
我有这个代码 GetComponent().bounds 和这个 GetComponent().bounds 尝试过 search两个组件之间有什么区别,但没有发现任何有用的东西。? 最佳答案 Dif
我们正在使用 Assets 商店中的一个对象,该对象使用了一个包含 32 种 Material 的网格渲染器。我们需要实现能够替换列表中的一种 Material 并保留其余 Material 的功能。
我是一名优秀的程序员,十分优秀!