3

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

当我试图对纹理和矩阵、向量和 int 值和浮点数等着色器数据做同样的事情时,我被卡住了。我知道我可以通过函数获得这些阵型Material.GetXXX

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

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

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

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

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

注意

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

4

1 回答 1

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保存到资源文件夹。

于 2018-10-31T17:58:47.650 回答