using Thousandto.Core.Asset; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using UnityEditor; using UnityEditor.SceneManagement; using UnityEngine; namespace Thousandto.Editor.Test { public partial class SplitTerrainWindow : UnityEditor.EditorWindow { private bool _foldOutCreatePrefab = true; public void DrawCovertToPrefabRegion() { var oldColor = GUI.contentColor; GUI.contentColor = Color.green; _foldOutCreatePrefab = EditorGUILayout.Foldout(_foldOutCreatePrefab, "将网格obj转成prefab"); GUI.contentColor = oldColor; if (_foldOutCreatePrefab) { GUILayout.BeginVertical(); if (_curTerrainData != null) { GUILayout.Box("选择一个或几个需要转成prefab的网格文件", EditorStyles.helpBox, GUILayout.Width(WINDOW_WIDTH), GUILayout.Height(50)); DrawCreatePrefabButton(); } else GUILayout.Box("先选择一个Terrain", EditorStyles.helpBox, GUILayout.Width(WINDOW_WIDTH), GUILayout.Height(50)); GUILayout.EndVertical(); } } void DrawCreatePrefabButton() { DrawSpaceLine(); if (_curTerrainData != null) { GUILayout.BeginHorizontal(); if (GUILayout.Button("生成新prefab")) { var t = AssetDatabase.LoadAssetAtPath(_terrainPath); for (int i = 0; i < Selection.objects.Length; ++i) { EditorUtility.DisplayProgressBar("生成prefab", Selection.objects[i].name, i / (float)Selection.objects.Length); var savedMeshPath = AssetDatabase.GetAssetPath(Selection.objects[i]); //SetMaterial2(terrain, result); var mat = SplitTerrain.GetSavedMeshMaterial(_curTerrainData, savedMeshPath); var savePrefabName = "Mesh_" + Utils.CalcTerrainMeshIndex(savedMeshPath, (int)BlockResolution) + ".prefab"; SplitTerrain.CreateNewUnityMesh(ConfigDefine.GetSavePrefabPath(savePrefabName), savedMeshPath, mat); //SplitTerrain.SetMaterial(_curTerrainData, AssetDatabase.GetAssetPath(Selection.objects[i])); } EditorUtility.ClearProgressBar(); } if (GUILayout.Button("Load选中的prefab")) { var t = AssetDatabase.LoadAssetAtPath(_terrainPath); for (int i = 0; i < Selection.objects.Length; ++i) { var savedMeshPath = AssetDatabase.GetAssetPath(Selection.objects[i]); if (!savedMeshPath.EndsWith(".prefab")) continue; if (savedMeshPath.IndexOf("Scene") == -1) continue; SplitTerrain.ShowPrefab(savedMeshPath); } } if (GUILayout.Button("Load all prefab")) { LoadAllTerrainPrefabAndThingPrefab(EditorSceneManager.GetActiveScene().name); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); if (GUILayout.Button("Reset lightmap index")) { ResetLightmapIndex(EditorSceneManager.GetActiveScene().name); } if(GUILayout.Button("Set old ligthmapScaleoffset")) { SetOldLightmapScaleOffset(); } GUILayout.EndHorizontal(); } } List LoadAllTerrainPrefabAndThingPrefab(string mapName) { List loadedPrefabs = new List(); var dir = ConfigDefine.GetSavePrefabPath(mapName); if (!Directory.Exists(dir)) dir = dir.Substring(0, dir.LastIndexOf("/")); var prefabs = Directory.GetFiles(dir, "*.prefab", SearchOption.AllDirectories); for (int i = 0; i < prefabs.Length; ++i) { var instance = (GameObject.Find(Path.GetFileNameWithoutExtension(prefabs[i]))); if (instance == null) { var assetGo = AssetDatabase.LoadAssetAtPath(prefabs[i]); instance = PrefabUtility.InstantiatePrefab(assetGo) as GameObject; } var renderers = instance.GetComponentsInChildren(); for (int j = 0; j < renderers.Length; ++j) { renderers[j].gameObject.isStatic = true; } instance.isStatic = true; loadedPrefabs.Add(instance); } return loadedPrefabs; } void ResetLightmapIndex(string mapName) { List loadedPrefabs = new List(); var dir = ConfigDefine.GetSavePrefabPath(mapName); if (!Directory.Exists(dir)) dir = dir.Substring(0, dir.LastIndexOf("/")); var prefabs = Directory.GetFiles(dir, "*.prefab", SearchOption.AllDirectories); for (int i = 0; i < prefabs.Length; ++i) { var instance = (GameObject.Find(Path.GetFileNameWithoutExtension(prefabs[i]))); if (instance == null) { var assetGo = AssetDatabase.LoadAssetAtPath(prefabs[i]); var script = assetGo.GetComponent(); if (script != null) { var prefabIndex = TerrainConfigLoader.GetIndexFromGameObjectName(assetGo.name); //var index = TerrainConfigLoader.GenerateLightmapIndex(prefabIndex); script.SetMeshIndex(prefabIndex); } } else { var script = instance.GetComponent(); if (script != null) { var prefabIndex = TerrainConfigLoader.GetIndexFromGameObjectName(instance.name); //var index = TerrainConfigLoader.GenerateLightmapIndex(prefabIndex); script.SetMeshIndex(prefabIndex); } } } AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); } void SetOldLightmapScaleOffset() { var gos = Selection.gameObjects; for(int i = 0; i < gos.Length; ++i) { var script = gos[i].GetComponent(); for(int j = 0; script != null && j < script.RendererInfos.Length; ++j) { var rendererInfo = script.RendererInfos[j]; rendererInfo.SourceRenderer.lightmapScaleOffset = rendererInfo.OldLightmapScaleOffset; rendererInfo.SourceRenderer.lightmapIndex = rendererInfo.OldLightmapIndex; } } } [MenuItem("Test/SetLightmap")] static void SetLightmap() { for(int i = 0; i < Selection.objects.Length; ++i) { var path = Selection.objects[i]; var assetGo = AssetDatabase.LoadAssetAtPath(AssetDatabase.GetAssetPath(path)); var script = assetGo.GetComponent(); if (script != null) { var prefabIndex = TerrainConfigLoader.GetIndexFromGameObjectName(assetGo.name); //var index = TerrainConfigLoader.GenerateLightmapIndex(prefabIndex); script.SetMeshIndex(prefabIndex); } EditorUtility.SetDirty(assetGo); } AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); } } }