unity3d 将立方体图保存到文件并加载到Unity中

uinbv5nw  于 2023-02-19  发布在  其他
关注(0)|答案(1)|浏览(127)

我尝试保存统一的cubemap对象,并加载它来执行保存/加载功能在我的应用程序中,所以我尝试了以下代码来保存我的cubemap,它的工作很好:

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是不被接受的,当你试图建立游戏。所以有没有另一种解决方案,以保存我的cubemap和重新加载它,而不使用“AssetDatabase.CreateAsset”,因为它调用的UnityEditor?

js5cn81o

js5cn81o1#

我不完全明白你想要归档什么。在构建中没有“资产”了,所以方法在构建中没有意义。
无论如何,要在编辑器中使用它们并能够构建您的代码,您只需使用预处理器#if UNITY_EDITOR <your code> #endif来处理只应存在于编辑器中的代码块:

#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

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

相关问题