using System; using System.Collections.Generic; using System.IO; using InfinityCode.RealWorldTerrain; using InfinityCode.RealWorldTerrain.Windows; using UnityEditor; using UnityEngine; public class WorldGeneration : EditorWindow { RealWorldTerrainContainer container = null; private Vector2 scrollPosition; private int status = 0; // 0 - idle, 1 - execute, 2 - finalize private int executeIndex = -1; private bool finished = false; private int textureResolution = 2048; int latitude = 85; int longitude = -180; bool build = true; bool assign = true; string assetBundleName = ""; Queue directoriesCreated = new Queue(); private void Execute() { status = 1; executeIndex = -1; GenerateWorld(); } private void GenerateWorld() { if (latitude <= -85) { if (build) { StoreTerrains(); build = false; } return; } finished = false; assign = true; assetBundleName = latitude + "_" + longitude; RealWorldTerrainWindow.OpenWindow(RealWorldTerrainGenerateType.full, container); RealWorldTerrainWindow.prefs.topLatitude = latitude; RealWorldTerrainWindow.prefs.leftLongitude = longitude; RealWorldTerrainWindow.prefs.bottomLatitude = latitude-10; RealWorldTerrainWindow.prefs.rightLongitude = longitude +10; RealWorldTerrainWindow.prefs.sizeType = 2; RealWorldTerrainWindow.prefs.fixedTerrainSize = new Vector3(100, 100, 100); RealWorldTerrainWindow.prefs.textureSize = new RealWorldTerrainVector2i(textureResolution, textureResolution); RealWorldTerrainWindow.prefs.terrainCount = new RealWorldTerrainVector2i(1,1); RealWorldTerrainWindow.OnCaptureCompleted += OnCaptureCompleted; RealWorldTerrainWindow.OnCaptureCanceled += OnCaptureCanceled; RealWorldTerrainWindow.StartCapture(); longitude += 10; if(longitude >= 180) { longitude = -180; latitude -= 10; } } public void AssignAssetBundle() { string path = @"myPath"; DateTime createdOn = DateTime.MinValue; string lastCreatedDirectory = ""; DirectoryInfo di = new DirectoryInfo(path); foreach (DirectoryInfo dr in di.GetDirectories()) { if (dr.CreationTime > createdOn) { lastCreatedDirectory = dr.ToString(); createdOn = dr.CreationTime; } } directoriesCreated.Enqueue(lastCreatedDirectory); string lastCreatedDirectoryPath = lastCreatedDirectory.Substring(lastCreatedDirectory.IndexOf("Assets")); AssetImporter.GetAtPath(lastCreatedDirectoryPath).SetAssetBundleNameAndVariant(assetBundleName, ""); Debug.Log(lastCreatedDirectoryPath); RealWorldTerrainWindow.CancelCapture(); } private void StoreTerrains() { BuildPipeline.BuildAssetBundles(@"D:\docs\RodolpheBansard\Terrains - AssetBundle\0", BuildAssetBundleOptions.ChunkBasedCompression, BuildTarget.StandaloneWindows64); Debug.Log("build finished"); //DeleteDirectoriesFromProject(); } private void DeleteDirectoriesFromProject() { while(directoriesCreated.Count > 0) { Directory.Delete(directoriesCreated.Dequeue()); } } private void OnCaptureCanceled() { UnsubscribeFromEvents(); status = 2; } private void OnCaptureCompleted() { UnsubscribeFromEvents(); finished = true; Repaint(); } private void OnGUI() { if (status == 0) OnIdleGUI(); else if (status == 1) OnWaitGUI(); else if (Event.current.type == EventType.Repaint) { status = 0; Repaint(); } } private void OnIdleGUI() { if (GUILayout.Button("Generate")) Execute(); } private void OnWaitGUI() { if (finished) { if (assign) { AssignAssetBundle(); assign = false; } GenerateWorld(); } Rect rect = GUILayoutUtility.GetRect(GUIContent.none, GUI.skin.box, GUILayout.Height(20), GUILayout.ExpandWidth(true)); if (GUILayout.Button("Cancel")) { status = 2; RealWorldTerrainWindow.CancelCapture(); } } [MenuItem("Terrain Generation/World Generation")] private static void OpenWindow() { GetWindow(); } private void UnsubscribeFromEvents() { RealWorldTerrainWindow.OnCaptureCompleted -= OnCaptureCompleted; RealWorldTerrainWindow.OnCaptureCanceled -= OnCaptureCanceled; } }