【问题标题】:Dump resources from Unity game to a file将 Unity 游戏中的资源转储到文件中
【发布时间】:2018-10-31 17:50:17
【问题描述】:

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

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

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

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

问题是我需要知道属性的名称和它的类型,例如纹理、矩阵、浮点数、颜色等,然后​​才能在运行时获取它们的值

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

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

注意

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

【问题讨论】:

  • 我不是唯一一个对 Unity 有一些你不知道的事情感到惊讶的人。感觉这值得截图,或框架,或成就解锁奖......或其他东西;)
  • 很惊讶你很惊讶。没有人知道一切。并且都在这个网站上向其他人学习。
  • 没有。我很惊讶!我的电脑房里有一个底座。您的图标所在的位置。它说:像上帝一样的 Unity 用户,就在下面 ;)
  • @Confused Lol 谢谢

标签: c# unity3d dump shaderlab


【解决方案1】:

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

【讨论】:

  • 使用Unity很久了,从来没有接触过这个API。这将完成这项工作。我刚刚检查了它,它看起来像是来自UnityEditor 命名空间,这意味着它只能在编辑器中使用。它仍然很好。您只需要检测何时单击构建按钮,然后使用 ShaderUtil 获取属性和类型,然后保存到资源文件夹,如 this。最好在您的回答中提及这一点。谢谢。
  • 啊,我从来没用过。这是一个很好的补充。如果可以的话,我将把你的那部分评论逐字添加到答案中。
  • 我没关系
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多