void LoadHelper() { HelperObject = selectedObject; helperRoot = HelperObject.GetComponent <HelperRoot>(); tiles = new GameObject[HelperObject.transform.childCount]; for (int i = 0; i < tiles.Length; i++) { tiles[i] = HelperObject.transform.GetChild(i).gameObject; } }
void CleanUp() { EditorUtility.DisplayProgressBar("Clean Up", "Starting Cleaning process...", 0.0f); for (int i = 0; i < tiles.Length; i++) { Undo.RecordObject(tiles[i].transform, "CleanUp transform tile " + i); EditorUtility.DisplayProgressBar("Clean Up", "Cleaning up...", (i + 1) / (tiles.Length)); if (isTileEmpty(tiles[i])) { Undo.DestroyObjectImmediate(tiles[i]); } } EditorUtility.DisplayProgressBar("Clean Up", "Done", 1.0f); HelperObject = null; helperRoot = null; tiles = null; EditorUtility.ClearProgressBar(); Undo.CollapseUndoOperations(Undo.GetCurrentGroup()); }
void OnGUI() { if (HelperObject == null) { EditorGUILayout.HelpBox("No Helper selected.\nIf you want to create a new one, use \"Grid Generation\" tab.\nIf you want to load an existing helper, select it in the hierarchy and click \"Load Helper\"", MessageType.Info); } else { EditorGUILayout.HelpBox("Helper Root \" " + HelperObject.name + " \" selected.", MessageType.Info); } EditorGUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); if (GUILayout.Button("Load Helper", GUILayout.Height(30), GUILayout.Width(100))) { OnSelectionChange(); if (selectedObject == null) { errorLoadNoSelection = true; } else { errorLoadNoSelection = false; if (selectedObject.GetComponent <HelperRoot>() != null) { errorLoadNoComponent = false; createdHelper = false; LoadHelper(); } else { errorLoadNoComponent = true; HelperObject = null; helperRoot = null; } } } GUILayout.FlexibleSpace(); EditorGUILayout.EndHorizontal(); if (errorLoadNoSelection) { EditorGUILayout.HelpBox("Select an object in the Hierarchy", MessageType.Error); } if (errorLoadNoComponent) { EditorGUILayout.HelpBox("The selected object must have a \"Helper Root\" component.", MessageType.Warning); } toggleGeneration = EditorGUILayout.Foldout(toggleGeneration, "Grid Generation", true); if (toggleGeneration) { EditorGUILayout.BeginHorizontal(); GUILayout.Space(50); EditorGUILayout.BeginVertical(); //GUILayout.Label("Grid Generation", EditorStyles.boldLabel); width = EditorGUILayout.IntField("Columns Count", width); height = EditorGUILayout.IntField("Rows Count", height); GUILayout.Space(10); GUILayout.Label("Space between"); GUILayout.BeginHorizontal(); GUILayout.Space(10); spaceX = EditorGUILayout.FloatField("Each column", spaceX); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Space(10); spaceZ = EditorGUILayout.FloatField("Each row", spaceZ); GUILayout.EndHorizontal(); width = width < 1 ? 1 : width; height = height < 1 ? 1 : height; space = space < 0.0f ? 0.0f : space; spaceX = spaceX < 0.0f ? 0.0f : spaceX; spaceZ = spaceZ < 0.0f ? 0.0f : spaceZ; GUILayout.Space(10); EditorGUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); if (GUILayout.Button("Generate Helper Tiles", GUILayout.Height(30), GUILayout.Width(200))) { GenerateTiles(); createdHelper = true; } GUILayout.FlexibleSpace(); EditorGUILayout.EndHorizontal(); EditorGUILayout.EndVertical(); GUILayout.Space(50); EditorGUILayout.EndHorizontal(); if (createdHelper) { EditorGUILayout.HelpBox("The Helper has been successfully generated.\nHowever, you will need to select it in the hierarchy and press \"Load Helper\" to use it.", MessageType.Warning); } } GUILayout.Space(5); toggleManagement = EditorGUILayout.Foldout(toggleManagement, "Tile Editing", true); if (toggleManagement) { bool validSelection = true; if (selectedObjects == null) { EditorGUILayout.HelpBox("Select one or more tile to edit their properties.", MessageType.Info); GUI.enabled = false; } else { foreach (GameObject go in selectedObjects) { if (go != null) { Tile t = go.GetComponentInParent <Tile>(); if (t == null) { validSelection = false; } } } if (!validSelection) { EditorGUILayout.HelpBox("Warning: One or more of your selected objects and their parent does not have a Tile component.", MessageType.Warning); GUI.enabled = false; } else { GUI.enabled = true; } } selectedType = (TileType)EditorGUILayout.EnumPopup("Tile Type", selectedType); if (selectedType != currentType) { currentType = selectedType; UpdateModels(); selectedModelIndex = 0; } List <string> choices = new List <string>(); choices.Add("None"); if (models != null) { foreach (GameObject go in models) { choices.Add(go.name); } } selectedModelIndex = EditorGUILayout.Popup("Model to apply", selectedModelIndex, choices.ToArray()); if (GUILayout.Button("Apply")) { if (selectedModelIndex == 0 && selectedType == TileType.None) { for (int i = 0; i < selectedObjects.Length; i++) { if (selectedObjects[i].GetComponentInParent <Tile>() != null) { UpdateTile(selectedObjects[i].GetComponentInParent <Tile>(), currentType, emptyTilePrefab); } } } else { for (int i = 0; i < selectedObjects.Length; i++) { if (selectedObjects[i].GetComponentInParent <Tile>() != null) { UpdateTile(selectedObjects[i].GetComponentInParent <Tile>(), currentType, (selectedModelIndex - 1 >= 0) ? models[selectedModelIndex - 1] : null); } } } } if (GUILayout.Button("Refresh from prefab")) { for (int i = 0; i < selectedObjects.Length; i++) { if (selectedObjects[i].GetComponentInParent <Tile>() != null) { RefreshTile(selectedObjects[i].GetComponentInParent <Tile>()); } } } if (GUILayout.Button("Refresh passages")) { for (int i = 0; i < selectedObjects.Length; i++) { if (selectedObjects[i].GetComponentInParent <Tile>() != null) { RefreshPassages(selectedObjects[i].GetComponentInParent <Tile>()); } } } GUI.enabled = true; EditorGUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); if (HelperObject == null) { GUI.enabled = false; } if (GUILayout.Button("Link all Tiles", GUILayout.Height(30), GUILayout.Width(200))) { LinkTiles(); } GUILayout.FlexibleSpace(); EditorGUILayout.EndHorizontal(); } GUI.enabled = true; Tile.ShowLinks = GUILayout.Toggle(Tile.ShowLinks, "Show Tiles Links"); if (HelperObject == null) { GUI.enabled = false; } GUILayout.Space(15); EditorGUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); if (GUILayout.Button("Clean up", GUILayout.Height(30), GUILayout.Width(100))) { Undo.FlushUndoRecordObjects(); Undo.SetCurrentGroupName("UndoCleanUp"); CleanUp(); } GUILayout.FlexibleSpace(); EditorGUILayout.EndHorizontal(); EditorGUILayout.HelpBox("Information Warning: the \"TilePrefab\" object must stay the first child of its parent (a Tile). Same goes for the model object, which must stay the first child of the \"TilePrefab\" object.", MessageType.Info); }
void GenerateTiles() { EditorUtility.DisplayProgressBar("Generation", "Setting Up...", 0.0f); space += 2.0f; tiles = new GameObject[width * height * 2]; GameObject root = new GameObject("Helper Tiles", typeof(HelperRoot)); Undo.RegisterCreatedObjectUndo(root, "Created Helper Tiles"); HelperRoot hr = root.GetComponent <HelperRoot>(); hr.Width = width; hr.Height = height; if (emptyTilePrefab == null) { LoadEmptyTilePrefab(); } GameObject prefab = emptyTilePrefab; Vector3 size = prefab.GetComponentInChildren <MeshFilter>().sharedMesh.bounds.size; float baseSpaceX = spaceX; float baseSpaceZ = spaceZ; //We apply all the size transformations to match what we see in the scene if (prefab.transform.GetChild(0).localRotation.eulerAngles.y == 90.0f) { size.x *= prefab.transform.localScale.z; // Le x et le z sont inversés car le mesh utilisé pour l'instant est mal orienté size.y *= prefab.transform.localScale.y; size.z *= prefab.transform.localScale.x; size.x *= prefab.transform.GetChild(0).localScale.z; size.y *= prefab.transform.GetChild(0).localScale.y; size.z *= prefab.transform.GetChild(0).localScale.x; size.x *= prefab.transform.GetChild(0).GetChild(0).localScale.z; size.y *= prefab.transform.GetChild(0).GetChild(0).localScale.y; size.z *= prefab.transform.GetChild(0).GetChild(0).localScale.x; spaceX += size.z; spaceZ += size.x; } else { size.x *= prefab.transform.localScale.x; size.y *= prefab.transform.localScale.y; size.z *= prefab.transform.localScale.z; size.x *= prefab.transform.GetChild(0).localScale.x; size.y *= prefab.transform.GetChild(0).localScale.y; size.z *= prefab.transform.GetChild(0).localScale.z; size.x *= prefab.transform.GetChild(0).GetChild(0).localScale.x; size.y *= prefab.transform.GetChild(0).GetChild(0).localScale.y; size.z *= prefab.transform.GetChild(0).GetChild(0).localScale.z; spaceX += size.x; spaceZ += size.z; } if (prefab == null) { Debug.Log("No prefab"); } for (int j = 0; j < height * 2; j++) { for (int i = 0; i < width; i++) { EditorUtility.DisplayProgressBar("Generation", "Generating Tiles...", (float)((j * width + i + 1.0f)) / (width * height * 2)); tiles[j * width + i] = PrefabUtility.InstantiatePrefab(prefab) as GameObject; Vector3 pos = Vector3.zero; GameObject tile = new GameObject("Tile " + (i + 1) + " / " + (j + 1), typeof(Tile)); tile.transform.parent = root.transform; if (j % 2 == 0) { pos.x = i * spaceX * 1.5f; pos.z = j * spaceZ / 2.0f; } else { pos.x = i * spaceX * 1.5f + spaceX * 0.75f; pos.z = j * spaceZ / 2.0f + spaceZ * 0.0f; } tile.transform.position = pos; tiles[j * width + i].transform.position = pos; tiles[j * width + i].transform.parent = tile.transform; } } EditorUtility.DisplayProgressBar("Generation", "Done", 1.0f); space -= 2.0f; spaceX = baseSpaceX; spaceZ = baseSpaceZ; EditorUtility.ClearProgressBar(); helperRoot = null; HelperObject = null; tiles = null; }