将资源从 Unity 游戏转储到文件

Dump resources from Unity game to a file

我正在尝试创建一个函数,将 Unity 游戏中的所有资源数据转储到一个文件中,并能够从当前加载的场景中转储屏幕上的视频、音频、脚本名称和图像。

我在尝试对着色器数据(如纹理和矩阵、向量和 int 值以及浮点数)执行相同的操作时遇到困难。我知道我可以用 Material.GetXXX 函数获得这些阵型。

例如,我目前可以从标准着色器中获取主 Texture,它的纹理类型 属性 名为 _MainTex,其中:

Material mat = gameObject.GetComponent<MeshRenderer>().material;
Texture mat1Tex = mat.GetTexture("_MainTex");
SaveTex(mat1Tex);

问题是我需要知道属性的名称和类型,比如纹理、矩阵、浮点数、颜色等等,然后才能在 运行-时间

我希望项目中有许多来自第三方来源的着色器,手动检查每个着色器、复制它们的 属性 名称和类型以便我可以获得数据会很复杂。

有没有办法获取着色器 属性 以及使用 Material.GetXXX 函数检索其值所需的类型?如果这不可能,有没有办法单独转储着色器数据?

:

这不是保存功能,我也不是在寻找保存和加载游戏状态的方法。这是一个用于分析和解决 Unity 游戏问题的插件。

使用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;
    }
}

It's from the UnityEditor namespace which means that it can only be used in the Editor. It's still fine. You just have to detect when the build button is clicked then obtain the properties and types with ShaderUtil then save to the resources folder like .