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

Pro*_*mer 3 c# dump unity-game-engine shaderlab

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

我试图为着色器数据做同样的事情时遇到困难,例如Textures和Matrix,Vectors和int值以及浮点数.我知道我可以通过这些Material.GetXXX功能获得这些形成.

例如,我当前可以Texture从标准着色器获取main ,该着色器具有以下命名的Texture类型属性_MainTex:

Material mat = gameObject.GetComponent<MeshRenderer>().material;
Texture mat1Tex = mat.GetTexture("_MainTex");
SaveTex(mat1Tex);
Run Code Online (Sandbox Code Playgroud)

问题是我需要知道属性的名称以及它的类型,例如Texture,Matrix,Float,Color等,然后才能在运行时获取它们的值

我希望来自第三方资源的许多着色器都在项目中,手动遍历每个着色器,复制它们的属性名称和类型以便我可以获取数据会很复杂.

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

注意:

这不是一个保存功能,我不是在寻找保存和加载游戏状态的方法.这是一个用于分析Unity游戏并对其进行故障排除的插件.

Ruz*_*ihm 5

使用ShaderUtil.

  • ShaderUtil 会让你遍历每个属性.

  • ShaderUtil.GetPropertyCount将让你获得属性名称,用于像ShaderUtil.GetPropertyName.

  • GetTexture 将让您调用正确的方法来处理您当前所在的属性.

例如:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

它来自UnityEditor命名空间,这意味着它只能在编辑器中使用.它仍然很好.您只需要检测单击构建按钮的时间,然后使用ShaderUtil获取属性和类型,然后保存到资源文件夹,就像这样.