112 lines
3.9 KiB
C#
112 lines
3.9 KiB
C#
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
|
||
{
|
||
/// <summary>
|
||
/// 预览选中物件的光照贴图
|
||
/// </summary>
|
||
public partial class SplitTerrainWindow : UnityEditor.EditorWindow
|
||
{
|
||
private bool _splitTerrain = true;
|
||
private bool _collectThings = true;
|
||
private bool _loadAllPrefab = true;
|
||
private bool _bakeLightmap = true;
|
||
private bool _rebuildLightmap = true;
|
||
|
||
void DrawBakeGUI()
|
||
{
|
||
GUILayout.BeginHorizontal();
|
||
_splitTerrain = GUILayout.Toggle(_splitTerrain, "切割地形");
|
||
_collectThings = GUILayout.Toggle(_collectThings, "划分网格物件");
|
||
_loadAllPrefab = GUILayout.Toggle(_loadAllPrefab, "加载所有prefab");
|
||
GUILayout.EndHorizontal();
|
||
GUILayout.BeginHorizontal();
|
||
_bakeLightmap = GUILayout.Toggle(_bakeLightmap, "烘焙和重建lightmap");
|
||
_rebuildLightmap = GUILayout.Toggle(_rebuildLightmap, "仅重建lightmap");
|
||
GUILayout.EndHorizontal();
|
||
|
||
if (GUILayout.Button("Bake"))
|
||
{
|
||
BakeAll();
|
||
}
|
||
}
|
||
|
||
void BakeAll()
|
||
{
|
||
_bakeStart = false;
|
||
var mapName = EditorSceneManager.GetActiveScene().name;
|
||
|
||
if(_splitTerrain)
|
||
{
|
||
EditorUtility.DisplayProgressBar("Bake", "开始切割地形", 0);
|
||
//1. 切割地形生成网格,同时生成prefab
|
||
int chunkSize = TerrainConfigDefine.BLOCK_SIZE;
|
||
SplitTerrain st = new SplitTerrain();
|
||
st.StartSplitTerrain(_curTerrainData, SplitResolution, chunkSize, true);
|
||
}
|
||
|
||
if(_collectThings)
|
||
{
|
||
EditorUtility.DisplayProgressBar("Bake", "收集场景物件", 0.2f);
|
||
//2. 收集场景中物件,按照分块生成prefab
|
||
CollectThings ct = new CollectThings();
|
||
ct.SetResolution(_mapSize, _blockSize);
|
||
ct.Collect(mapName);
|
||
}
|
||
|
||
|
||
if(_bakeLightmap || _rebuildLightmap)
|
||
{
|
||
//3. 隐藏SceneRoot
|
||
var sceneRoot = GameObject.Find("SceneRoot");
|
||
if (sceneRoot != null) sceneRoot.SetActive(false);
|
||
}
|
||
|
||
if(_loadAllPrefab)
|
||
{
|
||
EditorUtility.DisplayProgressBar("Bake", "加载prefab", 0.4f);
|
||
//4. 加载所有生成prefab的地形网格和物件,需要设置为static
|
||
_loadedPrefabs = LoadAllTerrainPrefabAndThingPrefab(mapName);
|
||
}
|
||
|
||
if(_bakeLightmap)
|
||
{
|
||
EditorUtility.DisplayProgressBar("Bake", "烘焙lightmap", 0.8f);
|
||
//5. 烘焙lightmap
|
||
if (Lightmapping.BakeAsync())
|
||
{
|
||
_bakeStart = true;
|
||
Lightmapping.completed -= OnBakeFinish;
|
||
Lightmapping.completed += OnBakeFinish;
|
||
}
|
||
}
|
||
|
||
if(!_bakeLightmap && _rebuildLightmap)
|
||
{
|
||
OnBakeFinish();
|
||
}
|
||
}
|
||
|
||
void OnBakeFinish()
|
||
{
|
||
_bakeStart = false;
|
||
Lightmapping.completed -= OnBakeFinish;
|
||
AssetDatabase.SaveAssets();
|
||
AssetDatabase.Refresh();
|
||
EditorSceneManager.SaveOpenScenes();
|
||
EditorUtility.DisplayProgressBar("Bake", "创建新的lightmap", 0.9f);
|
||
if (_loadedPrefabs != null && _loadedPrefabs.Count > 0)
|
||
LightMapSpliter.CreateCombinedLightmap(_loadedPrefabs.ToArray());
|
||
EditorUtility.ClearProgressBar();
|
||
}
|
||
}
|
||
}
|