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); } }
/// <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); }
/// <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); } }
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); } }
/// <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(); }
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); }
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); }
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); }
// /// <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)); }
/// <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); } }
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(); }
//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*****************************"); }
/// <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); } }
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); }
/// <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; }
/// <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); }