Unity中Cubemap保存与加载功能实现技术咨询
在Unity中保存与加载Cubemap对象的实现思路与代码优化
我看你正在Unity里搭建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; // 后续的Cubemap处理逻辑 ... } }
这里先给你提个小优化:你先新建了一个Material实例,紧接着又用gameObj.GetComponent<MeshRenderer>().material把它覆盖了——这完全没必要,会凭空多占内存,直接写成var chambre = gameObj.GetComponent<MeshRenderer>().material;就够了。
然后说回核心的Cubemap保存加载:PlayerPrefs只能存字符串、数值这类基础数据,没法直接存Cubemap资源本身,得换个思路:
- 先把Cubemap导出成本地文件(比如Unity的
.asset格式,或者拆分六面成图片) - 用PlayerPrefs存这个文件的路径
- 加载时根据路径读取文件,再把Cubemap还原到对应的材质上
给你写个保存Cubemap的示例逻辑:
// 从材质中提取目标Cubemap(对应Skybox/Cubemap shader的_Tex参数) Cubemap targetCubemap = chambre.GetTexture("_Tex") as Cubemap; if(targetCubemap != null) { // 选在persistentDataPath下存储,打包后也能访问 string savePath = Path.Combine(Application.persistentDataPath, $"ChambreCubemap_{l+1}.asset"); // 编辑器下用AssetDatabase来保存资源 AssetDatabase.CreateAsset(targetCubemap, savePath); AssetDatabase.SaveAssets(); // 把路径存到PlayerPrefs里,方便后续加载 PlayerPrefs.SetString($"ChambreCubemapPath_{l+1}", savePath); }
加载的时候可以这么写:
// 假设roomIndex是你要加载的房间序号 string cubemapPath = PlayerPrefs.GetString($"ChambreCubemapPath_{roomIndex}"); if(!string.IsNullOrEmpty(cubemapPath) && File.Exists(cubemapPath)) { Cubemap loadedCubemap = AssetDatabase.LoadAssetAtPath<Cubemap>(cubemapPath); if(loadedCubemap != null) { // 找到对应的GameObject,给它的材质赋值Cubemap MeshRenderer targetRenderer = targetGameObject.GetComponent<MeshRenderer>(); targetRenderer.material.SetTexture("_Tex", loadedCubemap); } }
注意哦:上面的代码是编辑器环境下能用的,如果是打包后的运行时,AssetDatabase就失效了。这时候建议提前把Cubemap打包成AssetBundle,或者把Cubemap的六个面导出成图片,加载时用Texture2D读取再转换成Cubemap,这样兼容性更好。
内容的提问来源于stack exchange,提问作者Meher
相关产品推荐
相关产品推荐

