using System.Collections.Generic; using InfinityCode.RealWorldTerrain; using InfinityCode.RealWorldTerrain.Windows; using UnityEditor; using UnityEngine; public class AutomatorExample2 : EditorWindow { private List items = new List(); private Vector2 scrollPosition; private int status = 0; // 0 - idle, 1 - execute, 2 - finalize private int executeIndex = -1; private bool finished = false; private void Execute() { if (items.Count == 0) return; status = 1; executeIndex = -1; ExecuteNextTerrain(); } private void ExecuteNextTerrain() { finished = false; executeIndex++; if (executeIndex >= items.Count) { status = 2; Repaint(); return; } RealWorldTerrainItem item = items[executeIndex]; if (item == null) { finished = true; Repaint(); return; } // Here you select the type of regeneration (terrains, textures, additional). RealWorldTerrainWindow.OpenWindow(RealWorldTerrainGenerateType.terrain, item); // Here you configure the desired values in prefs. // You can set any number of values related to same type of regeneration (terrains, textures, additional). RealWorldTerrainWindow.prefs.heightmapResolution = 513; RealWorldTerrainWindow.OnCaptureCompleted -= OnCaptureCompleted; RealWorldTerrainWindow.OnCaptureCanceled -= OnCaptureCanceled; RealWorldTerrainWindow.OnCaptureCompleted += OnCaptureCompleted; RealWorldTerrainWindow.OnCaptureCanceled += OnCaptureCanceled; RealWorldTerrainWindow.StartCapture(); } 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() { Event e = Event.current; if (e.type == EventType.DragUpdated) { DragAndDrop.visualMode = DragAndDropVisualMode.Link; e.Use(); } else if (e.type == EventType.DragPerform) { DragAndDrop.AcceptDrag(); e.Use(); foreach (Object obj in DragAndDrop.objectReferences) { RealWorldTerrainItem item = obj as RealWorldTerrainItem; if (item == null && obj is GameObject) item = (obj as GameObject).GetComponent(); if (item != null && !items.Contains(item)) items.Add(item); } } scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition); bool hasNull = false; int removeIndex = -1; for (int i = 0; i < items.Count; i++) { EditorGUILayout.BeginHorizontal(); EditorGUI.BeginChangeCheck(); GUILayout.Label((i + 1).ToString(), GUILayout.ExpandWidth(false)); items[i] = EditorGUILayout.ObjectField(items[i], typeof(RealWorldTerrainItem), true) as RealWorldTerrainItem; if (EditorGUI.EndChangeCheck()) { if (items[i] == null) hasNull = true; } if (GUILayout.Button("X", GUILayout.ExpandWidth(false))) removeIndex = i; EditorGUILayout.EndHorizontal(); } if (hasNull) items.RemoveAll(i => i == null); if (removeIndex != -1) items.RemoveAt(removeIndex); GUILayout.BeginHorizontal(); GUILayout.Label((items.Count + 1).ToString(), GUILayout.ExpandWidth(false)); RealWorldTerrainItem newItem = EditorGUILayout.ObjectField(null, typeof(RealWorldTerrainItem), true) as RealWorldTerrainItem; GUILayout.EndHorizontal(); if (newItem != null) { if (items.Contains(newItem)) EditorUtility.DisplayDialog("Error", "The item is already in the list.", "OK"); else items.Add(newItem); } EditorGUILayout.EndScrollView(); if (GUILayout.Button("Execute")) Execute(); } private void OnWaitGUI() { if (finished) ExecuteNextTerrain(); Rect rect = GUILayoutUtility.GetRect(GUIContent.none, GUI.skin.box, GUILayout.Height(20), GUILayout.ExpandWidth(true)); float progress = (float)executeIndex / items.Count; EditorGUI.ProgressBar(rect, progress, Mathf.FloorToInt(progress * 100) + " %"); if (GUILayout.Button("Cancel")) { status = 2; RealWorldTerrainWindow.CancelCapture(); } } [MenuItem("RWT/Automator2")] private static void OpenWindow() { GetWindow(); } private void UnsubscribeFromEvents() { RealWorldTerrainWindow.OnCaptureCompleted -= OnCaptureCompleted; RealWorldTerrainWindow.OnCaptureCanceled -= OnCaptureCanceled; } }