我有一个方法,它将任何对象作为参数,它应该遍历属性,不管它们是什么。我正在尝试获取自定义着色器的属性(使用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访问它们?
答案 0 :(得分:1)
UnityEditor类有ShaderUtil,它包含以下方法:
GetPropertyCount - 获取Shader s中的属性数。
GetPropertyDescription - 在Shader s的index propertyIdx中获取着色器属性的描述。
要使用它,请在脚本中包含“使用UnityEditor”,然后键入ShaderUtil来访问它。(methodname)。
使用这些方法,您可以遍历自定义着色器属性。很奇怪你不能像GetProperties一样对类型做这件事,但这对我有用。
RANGE类型对我来说是一个谜,但它的作用是返回实际值的浮点值以及参数的最小值和最大值,这样你才知道它的范围是什么(因为它不是一个已知类型)。
请注意,这仅适用于编辑器,因此您必须使用条件#if XXXXX条件,因为UnityEditor类和此方法将无法运行。
ShaderUtil上的Unity文档:https://docs.unity3d.com/ScriptReference/ShaderUtil.html