代码之家  ›  专栏  ›  技术社区  ›  Programmer

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

  •  3
  • Programmer  · 技术社区  · 7 年前

    当我尝试对材质球数据(如纹理和矩阵、向量和int值以及浮点值)执行相同的操作时,我会陷入困境。我知道我可以用 Material.GetXXX 功能。

    例如,我目前可以获得 Texture 从具有名为 _MainTex 使用:

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

    问题是,在运行时获取属性值之前,我需要知道属性的名称和类型,例如纹理、矩阵、浮点、颜色等等

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

    材料.GetXXX 功能?如果这是不可能的,有没有任何方法可以单独转储着色器数据?

    注意

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

    1 回复  |  直到 7 年前
        1
  •  5
  •   Ruzihm aks786    7 年前

    使用 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 沙德鲁蒂尔 然后保存到资源文件夹,如 this