如何通过 GetProperties / PropertyInfo 访问自定义着色器属性和字段?

How to access custom shader properties and fields via GetProperties / PropertyInfo?

我有一个方法可以将任何对象作为参数,它应该遍历属性,无论它们是什么。我正在尝试获取自定义着色器(使用 ShaderForge 创建)的属性。这是方法:

public void save(object objectToSave) {

    var newProperties = new List<PropertyInfo>(objectToSave.GetType().GetProperties());

    foreach (PropertyInfo property in newProperties)
    {
        object value = property.GetValue(objectToSave, null);
    }
}

当我将自定义着色器作为参数传递类型为 Material 的对象(我在测试中传递了 RenderSettings.skybox)时,出现此错误:

Material doesn't have a color property '_Color'

可能是因为 objectToSave.GetType() returns 类型 Material 而不是 ShaderForge 着色器(不实现 _Color)实现的自定义参数。我如何告诉该方法这是一个带有自定义着色器的 Material,这样它就不会尝试查找常规字段和属性?如何让它获得实际属性和字段的列表?

当我在Unity中打开material时,它有这些参数。如何通过 GetProperties 访问它们?

UnityEditor class有ShaderUtil,其中包含以下方法:

  • GetPropertyCount - 获取 Shader 中属性的个数。

  • GetPropertyDescription - 在索引 属性Idx of Shader s.

  • 获取着色器 属性 的描述
  • GetPropertyName - 在着色器 s 的索引 属性Idx 处获取着色器 属性 的名称。
  • GetPropertyType - 在索引 属性Idx of Shader s.
  • 获取着色器 属性 的 ShaderProperyType
  • GetRangeLimits - 在着色器 s 的索引 属性Idx 处获取范围 属性 的限制。
  • GetTexDim - 获取着色器的纹理尺寸 属性。
  • IsShaderPropertyHidden - 索引 属性Idx 处的着色器 属性 是否隐藏?

要使用它,您需要在脚本中包含 "using UnityEditor",然后通过键入 ShaderUtil.(methodname).

来访问它

使用这些方法,您可以循环访问自定义着色器属性。奇怪的是,您不能像处理类型那样使用 GetProperties 执行此操作,但这对我有用。

RANGE 类型对我来说是个谜,但它的作用是 returns 实际值的浮点值以及参数的最小值和最大值,因此您知道它的范围是什么(因为它不是已知类型)。

请注意,这仅适用于编辑器,因此您必须在其周围使用条件#if XXXXX 条件,因为 UnityEditor class 并且此方法在运行时不起作用。

关于 ShaderUtil 的 Unity 文档:https://docs.unity3d.com/ScriptReference/ShaderUtil.html