要应用的材质值块。
MaterialPropertyBlock 由 Graphics.RenderMesh 和 Renderer.SetPropertyBlock 使用。在您想要使用相同的材质绘制多个对象,但属性略有不同的情况下使用它。例如,如果您想略微更改每个绘制网格的颜色。不支持更改渲染状态。
Unity 的地形引擎使用 MaterialPropertyBlock 来绘制树木;它们都使用相同的材质,但每棵树都有不同的颜色、比例和风力系数。
传递给 Graphics.RenderMesh 或 Renderer.SetPropertyBlock 的块将被复制,因此使用它的最有效方法是创建一个块并将其重复用于所有 DrawMesh 调用。使用 SetFloat、SetVector、SetColor、SetMatrix、SetTexture、SetBuffer 来添加或替换值。
请注意,这与 SRP Batcher 不兼容。在通用渲染管线 (URP)、高清渲染管线 (HDRP) 或基于可脚本化渲染管线 (SRP) 的自定义渲染管线中使用它可能会导致性能下降。
以下示例使用 MaterialPropertyBlock
创建 10 个具有随机颜色的游戏对象。要使用该示例,请将预制件附加到 myPrefab
属性。
其他资源: Graphics.RenderMesh、Material.
using UnityEngine;
public class CreateTenGameObjects : MonoBehaviour { public GameObject myPrefab;
void Start() { // Loop through 10 GameObjects for (int i = 0; i < 10; i++) { // Instantiate a new GameObject at a unique position GameObject newObject = Instantiate(myPrefab, new Vector3(i * 2f, 0, 0), Quaternion.identity);
// Create a new MaterialPropertyBlock MaterialPropertyBlock propertyBlock = new MaterialPropertyBlock();
// Set a random color in the MaterialPropertyBlock propertyBlock.SetColor("_Color", Random.ColorHSV());
// Apply the MaterialPropertyBlock to the GameObject newObject.GetComponent<MeshRenderer>().SetPropertyBlock(propertyBlock); } } }
isEmpty | 材质属性块是否为空? (只读) |
Clear | 清除材质属性值。 |
CopyProbeOcclusionArrayFrom | 此函数将整个源数组复制到名为 unity_ProbesOcclusion 的 Vector4 属性数组中,以用于实例阴影掩码渲染。 |
CopySHCoefficientArraysFrom | 此函数将整个源数组转换为 7 个 Vector4 属性数组,并将其复制到名为 unity_SHAr、unity_SHAg、unity_SHAb、unity_SHBr、unity_SHBg、unity_SHBb 和 unity_SHC 的数组中,以用于实例光探针渲染。 |
GetColor | 从属性块中获取颜色。 |
GetFloat | 从属性块中获取浮点数。 |
GetFloatArray | 从属性块中获取浮点数数组。 |
GetInt | 此方法已弃用。请改用 GetFloat 或 GetInteger。 |
GetInteger | 从属性块中获取整数。 |
GetMatrix | 从属性块中获取矩阵。 |
GetMatrixArray | 从属性块中获取矩阵数组。 |
GetTexture | 从属性块中获取纹理。 |
GetVector | 从属性块中获取向量。 |
GetVectorArray | 从属性块中获取向量数组。 |
HasBuffer | 检查 MaterialPropertyBlock 是否具有具有给定名称或名称 ID 的 ComputeBuffer 属性。要设置属性,请使用 SetBuffer。 |
HasColor | 检查 MaterialPropertyBlock 是否具有具有给定名称或名称 ID 的 Color 属性。要设置属性,请使用 SetColor。 |
HasConstantBuffer | 检查 MaterialPropertyBlock 是否具有具有给定名称或名称 ID 的 ConstantBuffer 属性。要设置属性,请使用 SetConstantBuffer。 |
HasFloat | 检查 MaterialPropertyBlock 是否具有具有给定名称或名称 ID 的 Float 属性。要设置属性,请使用 SetFloat。 |
HasInt | 此方法已弃用。请改用 HasFloat 或 HasInteger。 |
HasInteger | 检查 MaterialPropertyBlock 是否具有具有给定名称或名称 ID 的 Integer 属性。要设置属性,请使用 SetInteger。 |
HasMatrix | 检查 MaterialPropertyBlock 是否具有具有给定名称或名称 ID 的 Matrix 属性。这也适用于 Matrix 数组属性。要设置属性,请使用 SetMatrix。 |
HasProperty | 检查 MaterialPropertyBlock 是否具有具有给定名称或名称 ID 的属性。要设置属性,请使用 MaterialPropertyBlock 的 Set 方法之一。 |
HasTexture | 检查 MaterialPropertyBlock 是否具有具有给定名称或名称 ID 的 Texture 属性。要设置属性,请使用 SetTexture。 |
HasVector | 检查 MaterialPropertyBlock 是否具有具有给定名称或名称 ID 的 Vector 属性。这也适用于 Vector 数组属性。要设置属性,请使用 SetVector。 |
SetBuffer | 设置缓冲区属性。 |
SetColor | 设置颜色属性。 |
SetConstantBuffer | 将 ComputeBuffer 或 GraphicsBuffer 设置为 MaterialPropertyBlock 的命名常量缓冲区。 |
SetFloat | 设置浮点数属性。 |
SetFloatArray | 设置浮点数数组属性。 |
SetInt | 此方法已弃用。请改用 SetFloat 或 SetInteger。 |
SetInteger | 向块中添加属性。如果具有给定名称的整数属性已存在,则将替换旧值。 |
SetMatrix | 设置矩阵属性。 |
SetMatrixArray | 设置矩阵数组属性。 |
SetTexture | 设置纹理属性。 |
SetVector | 设置向量属性。 |
SetVectorArray | 设置向量数组属性。 |