美文网首页Unity
Unity 5.x动态加载光照信息(所有坑已踩)

Unity 5.x动态加载光照信息(所有坑已踩)

作者: 某人在 | 来源:发表于2018-05-18 17:18 被阅读110次

    转自:https://www.cnblogs.com/verlout/p/5734390.html

    能搜到这的应该是被新的烘焙系统坑了少时间,4.x到5.x美术必须重新烘焙,关于美术的没什么说的,只有---重新烘焙!

      新的烘焙系统,为了兼容5.x的多场景编辑功能,将烘焙信息从mesh全部挪到了一个中间件xxx.assets,这个资源文件在5.x烘焙完成后和光照贴图存放在一起,然而关于这个资源文件,我是查来查去没有找到任何接口可以访问。

      只能百度谷歌,发现方案基本都是序列化,因为上面提到的烘焙信息没有在mesh中保存,而是一个鸡肋资源文件,发布时xxx.assets可以删了。

      序列化哪些数据,在编辑器面板能看到,在下面代码中也能看到。

    编辑器脚本PrefabLightmapDataEditor.cs:

    using UnityEngine; using UnityEditor;public class PrefabLightmapDataEditor : Editor { [MenuItem("Ojcgames Tools/保存该场景预制件的烘焙信息", false, 0)] static void SaveLightmapInfoByGameObject() { GameObject go = Selection.activeGameObject; if(null == go)return; PrefabLightmapData data = go.GetComponent(); if (data == null) { data = go.AddComponent();

            }

            //save lightmapdata info by mesh.render

            data.SaveLightmap();

            EditorUtility.SetDirty(go);

            //applay prefab

            PrefabUtility.ReplacePrefab(go, PrefabUtility.GetPrefabParent(go), ReplacePrefabOptions.ConnectToPrefab);

        }

    }

    被绑定在预制件父级上的序列化脚本PrefabLightmapData.cs:

    using UnityEngine; using System.Collections; using System.Collections.Generic;public class PrefabLightmapData : MonoBehaviour { [System.Serializable] struct RendererInfo { public Renderer renderer; public int lightmapIndex; public Vector4 lightmapOffsetScale; }#if UNITY_EDITOR [UnityEngine.SerializeField] Texture2D[] lightmapTexs; //当前场景的灯光贴图#endif [UnityEngine.SerializeField] RendererInfo[] rendererList; #if UNITY_EDITOR public void SaveLightmap() { Renderer[] renders = GetComponentsInChildren(true); RendererInfo rendererInfo; rendererList = new RendererInfo[renders.Length]; int index = 0; for(int r = 0, rLength = renders.Length; r(true);

            for(int r = 0, rLength = renders.Length; r

    其中

    Texture2D[] lightmapTexs;

    Awake();

    是我为了方便美术测试,发布项目中,我手动管理何时加载光照信息和光照贴图,至此代码已提供完。

    下面说点碰到的坑:

    1、PC正常,发布到android或ios完全看不到光照信息,并且序列化参数都正确,光照贴图也加载正常,LightmapSettings.lightmapsMode = LightmapsMode.NonDirectional 设置正常:

    在发布时,Edit - Project Settings - Graphics - Shader Stripping - Lightmap modes - Manual

    关于该选项的官方说明:By default, Unity looks at your scenes and lightmapping settings to figure out which Fog and Lightmapping modes are used; and skips corresponding shader variants. This saves game build data size, and improves loading times.

    也就是说,如果你想用脚本动态的控制,那么就得将这里设置为手动模式。

    2、最后一个坑就是不能完全相信搜索结果,他人记录的可能只是针对其出现的问题。

    相关文章

      网友评论

        本文标题:Unity 5.x动态加载光照信息(所有坑已踩)

        本文链接:https://www.haomeiwen.com/subject/dhagdftx.html