public static void BatchGenPrefab()
    {
        GameObject go = Selection.activeGameObject;

        if (go == null)
        {
            return;
        }

        string szPath = "Assets/Resources/QuadTree";

        CheckPath(szPath);

        //树信息
        Transform tree       = go.transform.FindChild("QuadTreeInfo");
        Object    treePrefab = PrefabUtility.CreateEmptyPrefab(szPath + "/" + go.name + ".prefab");

        treePrefab = PrefabUtility.ReplacePrefab(tree.gameObject, treePrefab);

        //物件信息
        szPath = szPath + "/" + go.name;
        CheckPath(szPath);

        Transform objs = go.transform.FindChild("Objs");

        foreach (Transform t in objs)
        {
            PrefabLightmapData pld = t.gameObject.AddComponent <PrefabLightmapData>();
            pld.SaveLightmap();

            Object tempPrefab = PrefabUtility.CreateEmptyPrefab(szPath + "/" + t.name + ".prefab");
            tempPrefab = PrefabUtility.ReplacePrefab(t.gameObject, tempPrefab);
        }
    }
Example #2
0
        /// <summary>
        /// Bakes the prefab lightmaps.
        /// </summary>
        /// <param name="prefabs">The <see cref="Array"/> of <see cref="PrefabLightmapData"/>.</param>
        private static void BakePrefabLightmaps(PrefabLightmapData[] prefabs)
        {
            if (prefabs.Length > 0)
            {
                for (int i = 0, length = prefabs.Length; i < length; i++)
                {
                    PrefabLightmapData          data           = prefabs[i];
                    GameObject                  gameObject     = data.gameObject;
                    List <LightmapRendererInfo> rendererInfos  = new List <LightmapRendererInfo>();
                    List <Texture2D>            lightmapColors = new List <Texture2D>();
                    List <Texture2D>            lightmapDirs   = new List <Texture2D>();
                    List <Texture2D>            shadowMasks    = new List <Texture2D>();

                    GenerateLightmapInfo(gameObject, rendererInfos, lightmapColors, lightmapDirs, shadowMasks);

                    data.RendererInfos  = rendererInfos.ToArray();
                    data.LightmapColors = lightmapColors.ToArray();
                    data.LightmapDirs   = lightmapDirs.ToArray();
                    data.ShadowMasks    = shadowMasks.ToArray();

                    // Save prefab.
                    PrefabUtil.SavePrefab(gameObject, ReplacePrefabOptions.ConnectToPrefab);

                    // Apply lightmap.
                    PrefabLightmapData.ApplyStaticLightmap(data);
                }
            }
        }
        public static void UpdateDependency()
        {
            GameObject go = Selection.activeGameObject;

            if (go == null)
            {
                return;
            }
            PrefabLightmapData data = go.GetComponent <PrefabLightmapData>();

            if (data == null)
            {
                return;
            }
            if (data.AllRendererInfo == null || data.AllRendererInfo.Count == 0)
            {
                return;
            }
            for (int i = 0; i < data.AllRendererInfo.Count; i++)
            {
                PrefabLightmapData.RendererInfo info = data.AllRendererInfo[i];
                info.UpdateDependency(go.transform);
                data.AllRendererInfo.RemoveAt(i);
                data.AllRendererInfo.Insert(i, info);
            }
            EditorUtility.SetDirty(go);
        }
Example #4
0
        /// <summary>
        /// Bakes the prefab lightmaps.
        /// </summary>
        /// <param name="prefabs">The <see cref="System.Array"/> of <see cref="PrefabLightmapData"/>.</param>
        private static void BakePrefabLightmaps(PrefabLightmapData[] prefabs)
        {
            if (prefabs == null || prefabs.Length == 0)
            {
                return;
            }

            for (int i = 0, length = prefabs.Length; i < length; i++)
            {
                var data           = prefabs[i];
                var gameObject     = data.gameObject;
                var rendererInfos  = new List <LightmapRendererInfo>();
                var lightmapColors = new List <Texture2D>();
                var lightmapDirs   = new List <Texture2D>();
                var shadowMasks    = new List <Texture2D>();

                GenerateLightmapInfo(gameObject, rendererInfos, lightmapColors, lightmapDirs, shadowMasks);

                data.RendererInfos      = rendererInfos.ToArray();
                data.LightmapColors     = lightmapColors.ToArray();
                data.LightmapDirections = lightmapDirs.ToArray();
                data.ShadowMasks        = shadowMasks.ToArray();

                // Save prefab.
                PrefabUtility.SavePrefabAsset(gameObject);

                // Apply lightmap.
                PrefabLightmapData.ApplyStaticLightmap(data);
            }
        }
Example #5
0
        public override void InstantiateGameObject(Resource res)
        {
            base.InstantiateGameObject(res);
            PrefabLightmapData lm = m_object.GetComponent <PrefabLightmapData>();

            if (lm != null)
            {
                lm.LoadLightmap();
            }

            GeoPolygon[] list = m_object.GetComponentsInChildren <GeoPolygon>();
            for (int i = 0; i < list.Length; i++)
            {
                GeoPolygon geo = list[i];
                Polygon    p   = new Polygon();
                p.c          = geo.transform.position.ToVector2d();
                p.isObstacle = true;
                p.bAirWall   = geo.bAirWall;
                p.Init(geo.GetVertex());
                p.active = true;
                m_polygon.Add(p);
                PhysicsManager.Inst.Add(p);
            }

            //GameObject staticObj = GameObject.Find("Static");
            GameObject staticObj = m_object;

            if (staticObj != null)
            {
                //StaticBatchingUtility.Combine(staticObj);

                StaticBatching(staticObj);
            }
        }
Example #6
0
    /// <summary>
    /// 生成lightmap和prefab资源
    /// </summary>
    ///
    private static void genBakeLightmapAndPrefab()
    {
        if (Lightmapping.giWorkflowMode != Lightmapping.GIWorkflowMode.OnDemand)
        {
            Debug.LogError("ExtractLightmapData requires that you have baked you lightmaps and Auto mode is disabled.");
            return;
        }
        Debug.ClearDeveloperConsole();

        PrefabLightmapData[] pldArr = GameObject.FindObjectsOfType <PrefabLightmapData>();
        if (pldArr == null || pldArr.Length <= 0)
        {
            EditorUtility.DisplayDialog("提示", "没有找到必要的脚本PrefabLightmapData,请检查场景", "OK");
            return;
        }

        //        Lightmapping.Bake();
        sceneLightmaps.Clear();


        Scene curScene = EditorSceneManager.GetActiveScene();

        sceneName = Path.GetFileNameWithoutExtension(curScene.name);

        //scenePath = Path.GetDirectoryName(curScene.path) + "/" + sceneName + "/";
        scenePath = "Assets/Scene/" + sceneName + "/";
        // 源目录
        string sceneOriginPath = scenePath;

        // 平台目录
        //scenePlatFormPath = Path.GetDirectoryName(curScene.path) + "/" + sceneName + afterFix ;
        scenePlatFormPath = sceneOriginPath;

        //CopyFolder(sceneOriginPath, scenePlatFormPath);
        AssetDatabase.Refresh();


        string resourcesPath = "Assets/Data/Lightmap/" + sceneName;

        //Path.GetDirectoryName(curScene.path) + "/" + sceneName + afterFix +  "_lightmap/" + sceneName;

        foreach (PrefabLightmapData pld in pldArr)
        {
            GameObject          gObj          = pld.gameObject;
            List <RendererInfo> renderers     = new List <RendererInfo>();
            List <Texture2D>    lightmapFars  = new List <Texture2D>();
            List <Texture2D>    lightmapNears = new List <Texture2D>();

            // scenePath copy至scenePlatFormPath中,之后在resourcesPath下生产asset
            genLightmapInfo(scenePlatFormPath, resourcesPath, gObj, renderers, lightmapFars, lightmapNears);

            pld.mRendererInfos = renderers.ToArray();
            pld.mLightmapFars  = lightmapFars.ToArray();
            pld.mLightmapNears = lightmapNears.ToArray();

            //改变当前场景中的光照贴图信息
            PrefabLightmapData.ApplyLightmaps(pld.mRendererInfos, pld.mLightmapFars, pld.mLightmapNears);
        }
    }
    static void UseLightmapData(GameObject obj)
    {
        PrefabLightmapData pld = obj.GetComponent <PrefabLightmapData>();

        if (pld != null)
        {
            pld.LoadLightmap();
        }
    }
    static void SaveLightmapData(GameObject obj)
    {
        PrefabLightmapData pld = obj.GetComponent <PrefabLightmapData>();

        if (pld == null)
        {
            pld = obj.AddComponent <PrefabLightmapData>();
        }

        pld.SaveLightmap();
    }
Example #9
0
    public static void UpdateLightmaps()
    {
        PrefabLightmapData pld = GameObject.FindObjectOfType <PrefabLightmapData>();

        if (pld == null)
        {
            return;
        }

        LightmapSettings.lightmaps = null;
        PrefabLightmapData.ApplyLightmaps(pld.mRendererInfos, pld.mLightmapFars, pld.mLightmapNears);

        Debug.Log("Prefab Lightmap updated");
    }
        public static void SaveLightMapInfo()
        {
            GameObject go = Selection.activeGameObject;

            if (go == null)
            {
                return;
            }
            PrefabLightmapData data = go.GetComponent <PrefabLightmapData>();

            if (data == null)
            {
                data = go.AddComponent <PrefabLightmapData>();
            }
            data.SaveLightmap(go.transform);
            EditorUtility.SetDirty(go);
        }
        public static void ClearLightmapInfo()
        {
            GameObject go = Selection.activeGameObject;

            if (go == null)
            {
                return;
            }
            PrefabLightmapData data = go.GetComponent <PrefabLightmapData>();

            if (data == null)
            {
                return;
            }
            data.AllRendererInfo.Clear();
            EditorUtility.SetDirty(go);
        }
Example #12
0
    static void SaveLightmapInfo()
    {
        GameObject go = Selection.activeGameObject;

        if (null == go)
        {
            return;
        }
        PrefabLightmapData data = go.GetComponent <PrefabLightmapData>();

        if (data == null)
        {
            data = go.AddComponent <PrefabLightmapData>();
        }
        data.SaveLightmap();
        //EditorUtility.SetDirty(go);
        PrefabUtility.ReplacePrefab(go, PrefabUtility.GetPrefabParent(go), ReplacePrefabOptions.ConnectToPrefab);
    }
Example #13
0
        static void LoadLightmapInfo()
        {
            GameObject go = Selection.activeGameObject;

            if (go == null)
            {
                return;
            }

            PrefabLightmapData data = go.GetComponent <PrefabLightmapData>();

            if (data == null)
            {
                return;
            }

            data.LoadLightmap();
            EditorUtility.SetDirty(go);
        }
    static void SaveLightmapInfoByGameObject()
    {
        GameObject go = Selection.activeGameObject;

        if (null == go)
        {
            return;
        }

        PrefabLightmapData data = go.GetComponent <PrefabLightmapData>();

        if (data == null)
        {
            data = go.AddComponent <PrefabLightmapData>();
        }
        //save lightmapdata info by mesh.render
        data.SaveLightmap();

        EditorUtility.SetDirty(go);
        //applay prefab
        PrefabUtility.ReplacePrefab(go, PrefabUtility.GetPrefabParent(go), ReplacePrefabOptions.ConnectToPrefab);
    }
Example #15
0
//    /// <summary>
//    /// 通过指定资源名称加载AssetBundle中的Text资源
//    /// </summary>
//    /// <param name="resName"></param>
//    /// <param name="callback"></param>
//    public static void LoadByteArrayByName(string resName, Action<byte[]> callback)
//    {
//        AssetLoader loader = AssetLoader.Instance;
//        string path = loader.GetAssetPath(resName);
//        //todo
////        LoadTextAtPath(path, callback);
//    }

    /// <summary>
    /// 加载场景资源
    /// </summary>
    /// <param name="sceneName">场景的名称</param>
    /// <param name="callback">场景实例完成的回调</param>
    public static IEnumerator LoadScene(string sceneName, Action <GameObject> callback, Action <float, float> progress)
    {
        if (!sceneName.EndsWith(".prefab"))
        {
            sceneName += ".prefab";
        }

        return(Instance.SwapAssetByName <UnityEngine.Object>(EAssetType.ALL.ToString(), sceneName, EAssetType.Scene, (obj) =>
        {
            if (obj == null)
            {
                if (callback != null)
                {
                    callback.Invoke(null);
                }
                return;
            }

            //查找当前场景的场景结点,进行删除
            PrefabLightmapData curScene = GameObject.FindObjectOfType <PrefabLightmapData>();
            if (curScene != null)
            {
#if UNITY_EDITOR
                GameObject.DestroyImmediate(curScene.gameObject);
#else
                GameObject.Destroy(curScene.gameObject);
#endif
            }

            //实例新场景
            GameObject gObj = GameObject.Instantiate(obj) as GameObject;
            if (callback != null)
            {
                callback.Invoke(gObj);
            }
        }, progress));
    }
Example #16
0
    /// <summary>
    /// 生成lightmap和prefab资源
    /// </summary>
    /// <param name="isQuiet">是否静默执行,true不会出现异常提示</param>
    private static void genBakeLightmapAndPrefab(bool isQuiet)
    {
        if (Lightmapping.giWorkflowMode != Lightmapping.GIWorkflowMode.OnDemand)
        {
            Debug.LogError("ExtractLightmapData requires that you have baked you lightmaps and Auto mode is disabled.");
            return;
        }
        Debug.ClearDeveloperConsole();

        PrefabLightmapData[] pldArr = GameObject.FindObjectsOfType <PrefabLightmapData>();
        if (pldArr == null || pldArr.Length <= 0)
        {
            if (!isQuiet)
            {
                EditorUtility.DisplayDialog("提示", "没有找到必要的脚本PrefabLightmapData,请检查场景", "OK");
            }
            return;
        }

        Lightmapping.Bake();
        sceneLightmaps.Clear();

        string path = Path.Combine(Application.dataPath, LightMapsDir);

        if (!Directory.Exists(path))
        {
            Directory.CreateDirectory(path);
        }

        Scene  curScene      = EditorSceneManager.GetActiveScene();
        string sceneName     = Path.GetFileNameWithoutExtension(curScene.name);
        string scenePath     = Path.GetDirectoryName(curScene.path) + "/" + sceneName + "/";
        string resourcesPath = Path.GetDirectoryName(curScene.path) + "/" + sceneName + "_lightmap/" + sceneName;

        foreach (PrefabLightmapData pld in pldArr)
        {
            GameObject          gObj          = pld.gameObject;
            List <RendererInfo> renderers     = new List <RendererInfo>();
            List <Texture2D>    lightmapFars  = new List <Texture2D>();
            List <Texture2D>    lightmapNears = new List <Texture2D>();

            genLightmapInfo(scenePath, resourcesPath, gObj, renderers, lightmapFars, lightmapNears);

            pld.mRendererInfos = renderers.ToArray();
            pld.mLightmapFars  = lightmapFars.ToArray();
            pld.mLightmapNears = lightmapNears.ToArray();

            GameObject targetPrefab = PrefabUtility.GetPrefabParent(gObj) as GameObject;

            //生成拷贝副本
            GameObject cloneGObj = (GameObject)GameObject.Instantiate(gObj);
            //删除过滤结点
            FilterSceneFlag[] flags = cloneGObj.GetComponentsInChildren <FilterSceneFlag>();
            foreach (FilterSceneFlag flag in flags)
            {
                flag.ClearSelf();
            }

            if (targetPrefab != null)
            {
                //自定义存放的路径
                PrefabUtility.ReplacePrefab(cloneGObj, targetPrefab);
            }
            else
            {
                //默认路径
                string prefabPath = Path.GetDirectoryName(curScene.path) + "/" + sceneName + ".prefab";
                PrefabUtility.CreatePrefab(prefabPath, cloneGObj, ReplacePrefabOptions.ConnectToPrefab);
            }
            GameObject.DestroyImmediate(cloneGObj);

            //改变当前场景中的光照贴图信息
            PrefabLightmapData.ApplyLightmaps(pld.mRendererInfos, pld.mLightmapFars, pld.mLightmapNears);
        }
    }
Example #17
0
    void OnGUI()
    {
        GUILayout.Label("Bake lightmap into prefabs", EditorStyles.boldLabel);
        GUILayout.Space(20);
        GUILayout.Label("Add path to folder and make sure its exists");

        pathToFolder = GUILayout.TextField(pathToFolder, 150);
        GUILayout.Space(5);


        selected = EditorGUILayout.Popup("Select Texture format for generated lightmaps", selected, options_string);
        GUILayout.Space(5);

        textureSizeIndex = EditorGUILayout.Popup("Select Size for generated lightmaps", textureSizeIndex, textureSting);
        GUILayout.Space(5);



        if (GUILayout.Button("Step 1 : Bake prefab lightmap"))
        {
            if (AssetDatabase.IsValidFolder(pathToFolder.Remove(pathToFolder.Length - 1)))
            {
                PrefabLightmapData.GenerateLightmapInfo(pathToFolder, options[selected], textureSize[textureSizeIndex]);
            }
            else
            {
                Debug.Log("Please create valid path");
            }
        }

        GUILayout.Space(15);

        if (GUILayout.Button("(OPTIONAL)Step 2 : Update Scene with Prefab Lightmaps"))
        {
            if (AssetDatabase.IsValidFolder(pathToFolder.Remove(pathToFolder.Length - 1)))
            {
                PrefabLightmapData.UpdateLightmaps();
            }
            else
            {
                Debug.LogError("Please create valid path");
            }
        }

        GUILayout.Space(20);

        checkToggle = EditorGUILayout.BeginToggleGroup("Enable LOD", checkToggle);

        GUILayout.Label("Add lightmap prefix", EditorStyles.boldLabel);


        lightMapFix = GUILayout.TextField(lightMapFix, 150);

        if (GUILayout.Button("Step 3 : Assign lightmaps to LOD"))
        {
            if (AssetDatabase.IsValidFolder(pathToFolder.Remove(pathToFolder.Length - 1)))
            {
                PrefabLightmapData.UseMeBeforeUpdatint(lightMapFix);

                //PrefabLightmapData.GenerateLightmapInfo(pathToFolder, options[selected], textureSize[textureSizeIndex]);
            }
            else
            {
                Debug.Log("Please create valid path");
            }
        }


        EditorGUILayout.EndToggleGroup();
    }
Example #18
0
        //according to the current platform, update all the lightmap that assets refrence
        private static void UpdateSceneLightmap()
        {
            PrefabLightmapData[] pldArr = GameObject.FindObjectsOfType <PrefabLightmapData>();
            if (pldArr == null || pldArr.Length <= 0)
            {
                EditorUtility.DisplayDialog("提示", "没有找到必要的脚本PrefabLightmapData,请检查场景", "OK");
                return;
            }

            //        Lightmapping.Bake();
            sceneLightmaps.Clear();

            string path = Path.Combine(Application.dataPath, LightMapsDir);

            if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }

            Scene curScene = EditorSceneManager.GetActiveScene();

            sceneName = Path.GetFileNameWithoutExtension(curScene.name);

            //#if UNITY_ANDROID
            //            afterFix = "_ANDROID";
            //#elif UNITY_STANDALONE_WIN
            //        afterFix = "_WIN";
            //#elif UNITY_IOS
            //            afterFix = "_IOS";

            //#endif


            string resourcesPath = Path.GetDirectoryName(curScene.path) + "/" + sceneName + afterFix + "_lightmap/";

            //if (!Directory.Exists(Path.GetDirectoryName(curScene.path) + "/" + sceneName + afterFix + "_lightmap"))
            //{
            //    EditorUtility.DisplayDialog("提示", "没有相关平台的lightmap", "OK");
            //    return;

            //}


            List <string> farNames  = new List <string>();
            List <string> nearNames = new List <string>();

            foreach (PrefabLightmapData pld in pldArr)
            {
                GameObject          gObj          = pld.gameObject;
                List <RendererInfo> renderers     = new List <RendererInfo>();
                List <Texture2D>    lightmapFars  = new List <Texture2D>();
                List <Texture2D>    lightmapNears = new List <Texture2D>();



                RemapTexture2D remapTex = new RemapTexture2D();
                //remapTex.OriginalLightmapIndex = originalLightmapIndex;
                //remapTex.OrginalLightmap = lightmapFar;



                var originFars  = pld.lightmapFars;
                var originNears = pld.lightmapNears;

                if (originFars != null && originFars.Length > 0)
                {
                    foreach (var tex in originFars)
                    {
                        if (tex == null)
                        {
                            continue;
                        }

                        string fullpath = AssetDatabase.GetAssetPath(tex);
                        int    lastVal  = fullpath.LastIndexOf("_ANDROID");
                        if (lastVal > 0)
                        {
                            fullpath = fullpath.Replace("_ANDROID", afterFix);
                        }
                        else if (fullpath.LastIndexOf("_IOS") > 0)
                        {
                            fullpath = fullpath.Replace("_IOS", afterFix);
                        }
                        else
                        {
                            fullpath = fullpath.Replace("_WIN", afterFix);
                        }


                        string fileName = fullpath;

                        Debug.Log(fileName);
                        if (farNames.Contains(fileName))
                        {
                            continue;
                        }
                        else
                        {
                            farNames.Add(fileName);
                        }

                        remapTex.LightmapFar = UpdateLightmapAsset(fileName);
                        lightmapFars.Add(remapTex.LightmapFar);
                    }
                }

                if (originNears != null && originNears.Length > 0)
                {
                    foreach (var tex in originNears)
                    {
                        if (tex == null)
                        {
                            continue;
                        }

                        string fullpath = AssetDatabase.GetAssetPath(tex);
                        int    lastVal  = fullpath.LastIndexOf("_ANDROID");
                        if (lastVal > 0)
                        {
                            fullpath = fullpath.Replace("_ANDROID", afterFix);
                        }
                        else if (fullpath.LastIndexOf("_IOS") > 0)
                        {
                            fullpath = fullpath.Replace("_IOS", afterFix);
                        }
                        else
                        {
                            fullpath = fullpath.Replace("_WIN", afterFix);
                        }


                        string fileName = fullpath;



                        if (nearNames.Contains(fileName))
                        {
                            continue;
                        }
                        else
                        {
                            nearNames.Add(fileName);
                        }



                        remapTex.LightmapNear = UpdateLightmapAsset(fileName);
                        lightmapNears.Add(remapTex.LightmapNear);
                    }
                }


                sceneLightmaps.Add(remapTex);


                //pld.mRendererInfos = renderers.ToArray();
                pld.lightmapFars  = lightmapFars.ToArray();
                pld.lightmapNears = lightmapNears.ToArray();

                GameObject targetPrefab = PrefabUtility.GetPrefabParent(gObj) as GameObject;

                if (targetPrefab != null)
                {
                    //自定义存放的路径
                    PrefabUtility.ReplacePrefab(gObj, targetPrefab);
                }
                else
                {
                    //默认路径
                    //                string prefabPath = Path.GetDirectoryName(curScene.path) + "/" + sceneName + ".prefab";
                    string prefabPath = Path.GetDirectoryName(curScene.path) + "/" + sceneName + "/" + gObj.name + ".prefab";
                    PrefabUtility.CreatePrefab(prefabPath, gObj, ReplacePrefabOptions.ConnectToPrefab);
                }

                //改变当前场景中的光照贴图信息
                PrefabLightmapData.ApplyLightmaps(pld.rendererInfos, pld.lightmapFars, pld.lightmapNears);
            }

            Debug.Log("*******************update finish*****************************");
        }
Example #19
0
        /// <summary>
        /// 生成lightmap和prefab资源
        /// </summary>
        ///
        private static void genBakeLightmapAndPrefab()
        {
            if (Lightmapping.giWorkflowMode != Lightmapping.GIWorkflowMode.OnDemand)
            {
                Debug.LogError("ExtractLightmapData requires that you have baked you lightmaps and Auto mode is disabled.");
                return;
            }
            Debug.ClearDeveloperConsole();

            PrefabLightmapData[] pldArr = GameObject.FindObjectsOfType <PrefabLightmapData>();
            if (pldArr == null || pldArr.Length <= 0)
            {
                EditorUtility.DisplayDialog("提示", "没有找到必要的脚本PrefabLightmapData,请检查场景", "OK");
                return;
            }

            //        Lightmapping.Bake();
            sceneLightmaps.Clear();

            string path = Path.Combine(Application.dataPath, LightMapsDir);

            if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }

            Scene curScene = EditorSceneManager.GetActiveScene();

            sceneName = Path.GetFileNameWithoutExtension(curScene.name);

            //#if UNITY_ANDROID
            //    afterFix = "_ANDROID";
            //#elif UNITY_STANDALONE_WIN
            //    afterFix = "_WIN";
            //#elif UNITY_IOS
            //    afterFix = "_IOS";

            //#endif



            scenePath = Path.GetDirectoryName(curScene.path) + "/" + sceneName + "/";

            string sceneOriginPath = Path.GetDirectoryName(curScene.path) + "/" + sceneName;

            scenePlatFormPath = Path.GetDirectoryName(curScene.path) + "/" + sceneName + afterFix;

            CopyFolder(sceneOriginPath, scenePlatFormPath);
            AssetDatabase.Refresh();


            scenePlatFormPath += "/";
            string resourcesPath = Path.GetDirectoryName(curScene.path) + "/" + sceneName + afterFix + "_lightmap/" + sceneName;

            foreach (PrefabLightmapData pld in pldArr)
            {
                GameObject          gObj          = pld.gameObject;
                List <RendererInfo> renderers     = new List <RendererInfo>();
                List <Texture2D>    lightmapFars  = new List <Texture2D>();
                List <Texture2D>    lightmapNears = new List <Texture2D>();

                // scenePath copy至scenePlatFormPath中,之后在resourcesPath下生产asset
                genLightmapInfo(scenePlatFormPath, resourcesPath, gObj, renderers, lightmapFars, lightmapNears);

                pld.rendererInfos = renderers.ToArray();
                pld.lightmapFars  = lightmapFars.ToArray();
                pld.lightmapNears = lightmapNears.ToArray();

                GameObject targetPrefab = PrefabUtility.GetPrefabParent(gObj) as GameObject;

                if (targetPrefab != null)
                {
                    //自定义存放的路径
                    PrefabUtility.ReplacePrefab(gObj, targetPrefab);
                }
                else
                {
                    //默认路径
                    //                string prefabPath = Path.GetDirectoryName(curScene.path) + "/" + sceneName + ".prefab";
                    string prefabPath = Path.GetDirectoryName(curScene.path) + "/" + sceneName + "/" + gObj.name + ".prefab";
                    PrefabUtility.CreatePrefab(prefabPath, gObj, ReplacePrefabOptions.ConnectToPrefab);
                }

                //改变当前场景中的光照贴图信息
                PrefabLightmapData.ApplyLightmaps(pld.rendererInfos, pld.lightmapFars, pld.lightmapNears);
            }
        }
Example #20
0
    static void SaveLightmapInfoByGameObject()
    {
        foreach (Object obj in Selection.objects)
        {
            if (null == obj)
            {
                continue;
            }
            GameObject         go   = obj as GameObject;
            PrefabLightmapData data = go.GetComponent <PrefabLightmapData>();
            if (data == null)
            {
                data = go.AddComponent <PrefabLightmapData>();
            }
            //save lightmapdata info by mesh.render
            data.SaveLightmap();
            EditorUtility.SetDirty(go);
            string SceneName = SceneManager.GetActiveScene().name;

            if (SceneName.Contains("_"))
            {
                int i = SceneName.LastIndexOf('_');
                SceneName = SceneName.Substring(0, i);
            }

            string prefabpath = "Assets/Resources/SceneLoadRes/" + SceneName + "/";
            if (!Directory.Exists(prefabpath))
            {
                Directory.CreateDirectory(prefabpath);
            }
            AssetDatabase.Refresh();
            string     prefabUrl = prefabpath + go.name + ".prefab";
            GameObject selGo     = GameObject.Instantiate(go);
            selGo.name = go.name;
            selGo.transform.position = go.transform.position;
            go.AddComponent <DynamLoadRes>().resUrl = SceneName + "/" + go.name;
            if (!File.Exists(prefabUrl))
            {
                PrefabUtility.CreatePrefab(prefabUrl, selGo);
            }
            else
            {
                prefabUrl = "SceneLoadRes/" + SceneName + "/" + go.name;
                Object origGo = Resources.Load(prefabUrl);
                PrefabUtility.ReplacePrefab(selGo, origGo, ReplacePrefabOptions.ConnectToPrefab);//PrefabUtility.GetPrefabParent(go)
            }

            DestroyImmediate(selGo);
            DestroyImmediate(data);
            List <GameObject> childList = new List <GameObject>();
            int childCount = go.transform.childCount;
            for (int i = 0; i < childCount; i++)
            {
                GameObject child = go.transform.GetChild(i).gameObject;
                childList.Add(child);
            }
            for (int i = 0; i < childCount; i++)
            {
                DestroyImmediate(childList[i]);
            }
        }

        EditorUtility.DisplayDialog("物体烘焙信息", "生成完成", "确定");

        //applay prefab
        // PrefabUtility.ReplacePrefab(go, PrefabUtility.GetPrefabParent(go), ReplacePrefabOptions.ConnectToPrefab);
    }
Example #21
0
    /// <summary>
    /// 使用PrefabLightmapData中的数据来设置lightmap的参数
    /// </summary>
    private IEnumerator ApplyLightmaps(PrefabLightmapData data)
    {
        if (data == null)
        {
            yield break;
        }

        RendererInfo[] rendererInfos = data.m_RendererInfos;
        if (rendererInfos == null)
        {
            Debug.LogWarning("<<PrefabLightmapData , ApplyLightmaps>> renderer info is null ! " + gameObject.name);
            yield break;
        }

        if (rendererInfos.Length <= 0)
        {
            yield break;
        }

        List <Texture2D> lightmapLights = Pool <Texture2D> .List.New(data.m_LightmapLightFiles.Length);

        for (int i = 0; i < data.m_LightmapLightFiles.Length; ++i)
        {
            AssetResource ar = new AssetResource();
            yield return(StartCoroutine(ResourceLoader.Instance.load_asset(data.m_LightmapLightFiles[i], typeof(Texture2D), ar)));

            m_TexRes.Add(ar);
            lightmapLights.Add(ar.asset_ as Texture2D);
        }

        List <Texture2D> lightmapDirs = Pool <Texture2D> .List.New(data.m_LightmapDirFiles.Length);

        for (int i = 0; i < data.m_LightmapDirFiles.Length; ++i)
        {
            AssetResource ar = new AssetResource();
            yield return(StartCoroutine(ResourceLoader.Instance.load_asset(data.m_LightmapDirFiles[i], typeof(Texture2D), ar)));

            m_TexRes.Add(ar);
            lightmapDirs.Add(ar.asset_ as Texture2D);
        }

        LightmapData[]      settingLightMaps    = LightmapSettings.lightmaps;    //当前场景中已经存在的lightmap数据
        int[]               lightmapOffsetIndex = new int[lightmapLights.Count]; //定义
        List <LightmapData> combinedLightmaps   = new List <LightmapData>();     //合并后的lightmap数据

        bool exist = false;

        for (int i = 0; i < lightmapLights.Count; i++)
        {
            exist = false;
            for (int j = 0; j < settingLightMaps.Length; j++)
            {
                if (lightmapLights[i] == settingLightMaps[j].lightmapColor)//如果与当前场景中的lightmap贴图一致
                {
                    lightmapOffsetIndex[i] = j;
                    exist = true;
                    break;
                }
            }

            //如果在当前场景的光照贴图列表中找不到,则创建新的光照数据
            if (!exist)
            {
                // 添加到combinedLightmaps的最后
                lightmapOffsetIndex[i] = settingLightMaps.Length + combinedLightmaps.Count;

                LightmapData newLightData = new LightmapData();
                newLightData.lightmapColor = lightmapLights[i];
                newLightData.lightmapDir   = lightmapDirs[i];
                combinedLightmaps.Add(newLightData);
            }
        }

        Pool <Texture2D> .List.Free(lightmapLights);

        Pool <Texture2D> .List.Free(lightmapDirs);

        //lightmap的组合数据
        LightmapData[] finalCombinedLightData = new LightmapData[combinedLightmaps.Count + settingLightMaps.Length];
        settingLightMaps.CopyTo(finalCombinedLightData, 0);
        combinedLightmaps.CopyTo(finalCombinedLightData, settingLightMaps.Length);
        combinedLightmaps.Clear();

        //重设所有Render的lightmapIndex和lightmapScaleOffset
        for (int i = 0; i < rendererInfos.Length; i++)
        {
            RendererInfo info = rendererInfos[i];

            info.renderer.lightmapIndex       = lightmapOffsetIndex[info.LightmapIndex];
            info.renderer.lightmapScaleOffset = info.LightmapOffsetScale;
        }

        LightmapSettings.lightmapsMode = LightmapsMode.CombinedDirectional;////(LightmapsMode)(2);//.SeparateDirectional;
        LightmapSettings.lightmaps     = finalCombinedLightData;
    }
Example #22
0
    /// <summary>
    /// 使用PrefabLightmapData中的数据来设置lightmap的参数
    /// </summary>
    void ApplyLightmapData(PrefabLightmapData data)
    {
        if (data == null)
        {
            return;
        }

        RendererInfo[] rendererInfos = data.m_RendererInfos;
        if (rendererInfos == null)
        {
            Debug.LogWarning("<<PrefabLightmapData , ApplyLightmaps>> renderer info is null ! " + gameObject.name);
            return;
        }

        if (rendererInfos.Length <= 0)
        {
            return;
        }

        LightmapData[] settingLightMaps = LightmapSettings.lightmaps;//当前场景中已经存在的lightmap数据
        if (settingLightMaps == null)
        {
            Debug.LogWarning("<<PrefabLightmapData , ApplyLightmaps>> LightmapSettings.lightmaps is null !");
            return;
        }

        string[] lightmap_light_files = data.m_LightmapLightFiles;
        if (lightmap_light_files == null)
        {
            Debug.LogWarning("<<PrefabLightmapData , ApplyLightmaps>> lightmap_light_files is null !");
            return;
        }

        List <int> lightmapOffsetIndex = Pool <int> .List.New(lightmap_light_files.Length);//定义

        for (int i = 0; i < lightmap_light_files.Length; ++i)
        {
            lightmapOffsetIndex.Add(0);
        }

        bool exist = false;

        for (int i = 0; i < lightmap_light_files.Length; i++)
        {
            exist = false;
            for (int j = 0; j < settingLightMaps.Length; j++)
            {
                string filename = System.IO.Path.GetFileNameWithoutExtension(lightmap_light_files[i]);
                if (filename == settingLightMaps[j].lightmapColor.name)//如果与当前场景中的lightmap贴图一致
                {
                    lightmapOffsetIndex[i] = j;
                    exist = true;
                    break;
                }
            }

            //如果在当前场景的光照贴图列表中找不到
            if (!exist)
            {
                lightmapOffsetIndex[i] = -1;
            }
        }

        //重设所有Render的lightmapIndex和lightmapScaleOffset
        for (int i = 0; i < rendererInfos.Length; i++)
        {
            RendererInfo info = rendererInfos[i];

            int lightmap_index = lightmapOffsetIndex[info.LightmapIndex];

            if (lightmap_index == -1)
            {
                continue;
            }

            if (info.renderer == null)
            {
                continue;
            }

            // 开启ShadowMask
            Material mat = info.renderer.sharedMaterial;
            if (mat != null)
            {
                // 获取ShadowMask贴图
                Texture shadow_mask_tex = settingLightMaps[lightmap_index].shadowMask;
                if (shadow_mask_tex != null)
                {
                    mat.EnableKeyword("SHADOWS_SHADOWMASK");

                    // 设置unity_ShadowMask贴图
                    MaterialPropertyBlock property_block = new MaterialPropertyBlock();
                    info.renderer.GetPropertyBlock(property_block);
                    property_block.SetTexture("unity_ShadowMask", shadow_mask_tex);
                    info.renderer.SetPropertyBlock(property_block);
                }

                // 设置lightmap索引
                info.renderer.lightmapIndex       = lightmap_index;
                info.renderer.lightmapScaleOffset = info.LightmapOffsetScale;
            }
            else
            {
                Debug.Log("[ApplyLightmapData]object has no material", info.renderer);
            }
        }

        Pool <int> .List.Free(lightmapOffsetIndex);
    }