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

时间:2018-01-01 15:21:38

标签: unity3d 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)时,我收到此错误:

  

材质没有颜色属性'_Color'

也许这是因为objectToSave.GetType()返回的是Material类型而不是ShaderForge着色器(它没有实现_Color)实现的自定义参数。如何告诉方法这是一个带自定义着色器的材质,所以它不会尝试查找常规字段和属性?如何让它获得实际属性和字段的列表?

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

Material settings

1 个答案:

答案 0 :(得分:1)

UnityEditor类有ShaderUtil,它包含以下方法:

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

  • GetPropertyDescription - 在Shader s的index propertyIdx中获取着色器属性的描述。

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

要使用它,请在脚本中包含“使用UnityEditor”,然后键入ShaderUtil来访问它。(methodname)。

使用这些方法,您可以遍历自定义着色器属性。很奇怪你不能像GetProperties一样对类型做这件事,但这对我有用。

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

请注意,这仅适用于编辑器,因此您必须使用条件#if XXXXX条件,因为UnityEditor类和此方法将无法运行。

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