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

3
我想创建一个函数,将Unity游戏中的所有资源数据导出到文件中。我已经成功将当前加载场景中的视频、音频、脚本名称和屏幕图像导出,但在尝试导出纹理、矩阵、向量、整数值和浮点数等着色器数据时遇到了困难。我知道可以使用 Material.GetXXX 函数获取这些信息。
例如,我现在可以通过以下代码从标准着色器中获取主要的 Texture,该着色器具有名为 _MainTex 的 Texture 类型属性:
Material mat = gameObject.GetComponent<MeshRenderer>().material;
Texture mat1Tex = mat.GetTexture("_MainTex");
SaveTex(mat1Tex);

问题在于我需要知道属性的名称以及其类型,例如Texture、Matrix、Float、Color等等,这样我才能在运行时获取它们的值。
我期望从第三方源中获得许多着色器,并且手动检查每个着色器,复制它们的属性名称和类型以便获取数据将会很复杂。
是否有一种方法可以获取着色器的属性和所需的类型,以便使用Material.GetXXX函数来检索它们的值?如果不可能,是否有任何方法可以单独转储着色器数据?
注意:这不是保存功能,我也不是在寻找保存和加载游戏状态的方法。这是一个用于分析和排除Unity游戏问题的插件。

3
我很惊讶你对Unity还有不了解的地方,感觉这值得截个屏、挂起来或者获得一个成就解锁奖励……总之,需要庆祝一下 ;) - Confused
1
惊讶你感到惊奇。没有人知道所有的事情,我们都可以从这个网站上互相学习。 - Programmer
不,我很惊讶!我在电脑房里有一个基座。上面放着你的图标。它写着:神一般的Unity用户,就在下面;) - Confused
@Confused 哈哈,谢谢。 - Programmer
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获取属性和类型,然后保存到资源文件夹中,就像这样

1
使用Unity已经有很长一段时间了,但从未听说过这个API。这个API可以胜任工作。我刚刚查看了它,它似乎来自UnityEditor命名空间,这意味着它只能在编辑器中使用。这还是可以的。您只需要检测生成按钮何时被点击,然后使用ShaderUtil获取属性和类型,最后保存到资源文件夹中,就像这样。在您的答案中提到这一点会很好。谢谢。 - Programmer
1
啊,我以前从未使用过它。这是一个很好的东西。如果可以的话,我将直接将您评论中的那一部分添加到答案中。 - Ruzihm
1
我没问题。 - Programmer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接