我正在尝试创建一个函数,该函数将Unity游戏中的所有Resources数据转储到文件中,并能够从当前加载的场景转储视频,音频,脚本名称和屏幕上的图像。
在尝试对着色器数据(例如“纹理”和“矩阵”,“向量”和“ int值”和“浮点数”)进行相同处理时,我陷入了困境。我知道我可以使用Material.GetXXX
函数来获得这些格式。
例如,我目前可以从标准着色器获取主Texture
,该标准着色器具有一个名为_MainTex
的Texture类型,其属性为:
Material mat = gameObject.GetComponent<MeshRenderer>().material;
Texture mat1Tex = mat.GetTexture("_MainTex");
SaveTex(mat1Tex);
问题是我需要知道属性的名称以及它的类型,例如纹理,矩阵,浮点数,颜色等,然后才能在运行时获取它们的值。 < / p>
我希望项目中有许多来自第三方的着色器,并且手动检查每个着色器,复制它们的属性名称和类型以便获取数据会很复杂。
是否有一种方法可以获取着色器属性和使用Material.GetXXX
函数检索其值所需的类型?如果这不可能,是否有任何方法可以单独转储着色器数据?
注意:
这不是保存功能,我不是在寻找保存和加载游戏状态的方法。这是一个用于分析Unity游戏并对其进行故障排除的插件。
答案 0 :(得分:5)
使用ShaderUtil。
ShaderUtil.GetPropertyCount
将使您遍历每个
属性。
ShaderUtil.GetPropertyName
将使您获得以下属性的名称
在GetTexture
之类的方法中使用。
ShaderUtil.GetPropertyType
将使您调用适当的方法来
处理您当前所在的属性。
例如:
Shader shader = mat.shader;
for (int i = 0 ; i < ShaderUtil.GetPropertyCount(shader) ; i++) {
String propertyName = ShaderUtil.GetPropertyName(shader,i);
ShaderUtil.ShaderPropertyType propertyType = ShaderUtil.GetPropertyType(shader,i);
switch(propertyType) {
case ShaderUtil.ShaderPropertyType.TexEnv: {
Texture tex = mat.GetTexture(propertyName);
SaveTex(tex);
} break;
default: {
Debug.Log(propertyName + " is not a texture.");
} break;
}
}
它来自UnityEditor命名空间,这意味着它只能在编辑器中使用。还可以您只需要检测何时单击构建按钮,然后使用ShaderUtil获取属性和类型,然后保存到this之类的资源文件夹中即可。