将Cubemap保存到文件并在Unity中加载它

时间:2018-04-13 09:08:40

标签: unity3d save

我正在尝试将cupemap对象保存在unity中并加载它以在我的应用程序中执行SAVE / LOAD函数,所以我尝试使用此代码来保存我的立方体贴图并且它工作正常:

foreach (var gameObj in FindObjectsOfType(typeof(GameObject)) as GameObject[])
{
    if (gameObj.name.StartsWith("Chambre"))
    {
        PlayerPrefs.SetString("Chambre " + (l + 1), gameObj.name);
        var chambre = new Material(Shader.Find("Skybox/Cubemap"));
        chambre = gameObj.GetComponent<MeshRenderer>().material;
        var Texture1 = chambre.GetTexture("_Tex");

        if (!AssetDatabase.Contains(Texture1))
        {
            AssetDatabase.CreateAsset(Texture1, "Assets/Resources/Saved/chambre" + (l + 1) + ".mat");
            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();
        }

        l++;
    }
}

但是我在使用导入UnityEditor时遇到的问题是当你尝试构建游戏时没有接受所以是否有另一种解决方案来保存我的立方体贴图并重新加载它而不使用“AssetDatabase.CreateAsset”因为它由UnityEditor调用。

1 个答案:

答案 0 :(得分:0)

我不完全明白你想要存档的内容。 在一个构建中没有&#34;资产&#34;因为这些方法在构建中没有任何意义。

无论如何要在编辑器中使用它们并且能够构建代码,您只需使用预处理器#if UNITY_EDITOR <your code> #endif arround代码块,它们只存在于编辑器中:

#if UNITY_EDITOR
    using UnityEditor;
#endif

...

#if UNITY_EDITOR
    foreach (var gameObj in FindObjectsOfType(typeof(GameObject)) as GameObject[])
    {
        if (gameObj.name.StartsWith("Chambre"))
        {
            PlayerPrefs.SetString("Chambre " + (l + 1), gameObj.name);
            var chambre = new Material(Shader.Find("Skybox/Cubemap"));
            chambre = gameObj.GetComponent<MeshRenderer>().material;
            var Texture1 = chambre.GetTexture("_Tex");

            if (!AssetDatabase.Contains(Texture1))
            {
                AssetDatabase.CreateAsset(Texture1, "Assets/Resources/Saved/chambre" + (l + 1) + ".mat");
                AssetDatabase.SaveAssets();
                AssetDatabase.Refresh();
            }

            l++;
        }
    }

#endif

因此,您的构建中不会包含/执行这些代码块。