将Unity游戏中的资源转储到文件

时间:2018-10-31 17:50:17

标签: c# unity3d dump shaderlab

我正在尝试创建一个函数,该函数将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游戏并对其进行故障排除的插件。

1 个答案:

答案 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之类的资源文件夹中即可。