void GenerateBaseStructure() { if (GridHelperUtils.CheckMissingParameters(parameterValues)) { return; } GridHelperUtils.ClearScene(); var mapType = mapTypes[mapTypeIndex]; var camera = Camera.main; if (camera == null) { var cameraObject = new GameObject("Main Camera"); cameraObject.tag = "MainCamera"; cameraObject.AddComponent <Camera>(); camera = cameraObject.GetComponent <Camera>(); } if (useMovableCamera) { camera.gameObject.AddComponent <CameraController>(); camera.gameObject.GetComponent <CameraController>().ScrollSpeed = cameraScrollSpeed; camera.gameObject.GetComponent <CameraController>().ScrollEdge = cameraScrollEdge; } cellGrid = new GameObject("CellGrid"); players = new GameObject("Players"); units = new GameObject("Units"); guiController = new GameObject("GUIController"); directionalLight = new GameObject("DirectionalLight"); var light = directionalLight.AddComponent <Light>(); light.type = LightType.Directional; light.transform.Rotate(45f, 0, 0); for (int i = 0; i < nHumanPlayer; i++) { var player = new GameObject(string.Format("Player_{0}", players.transform.childCount)); player.AddComponent <HumanPlayer>(); player.GetComponent <Player>().PlayerNumber = players.transform.childCount; player.transform.parent = players.transform; } for (int i = 0; i < nComputerPlayer; i++) { var aiPlayer = new GameObject(string.Format("AI_Player_{0}", players.transform.childCount)); aiPlayer.AddComponent <NaiveAiPlayer>(); aiPlayer.GetComponent <Player>().PlayerNumber = players.transform.childCount; aiPlayer.transform.parent = players.transform; } Type selectedGenerator = generators[generatorIndex]; var cellGridScript = cellGrid.AddComponent <CellGrid>(); ICellGridGenerator generator = (ICellGridGenerator)Activator.CreateInstance(selectedGenerator); generator.CellsParent = cellGrid.transform; var unitGenerator = cellGrid.AddComponent <CustomUnitGenerator>(); unitGenerator.UnitsParent = units.transform; unitGenerator.CellsParent = cellGrid.transform; var guiControllerScript = guiController.AddComponent <GUIController>(); guiControllerScript.CellGrid = cellGridScript; foreach (var fieldName in parameterValues.Keys) { FieldInfo prop = generator.GetType().GetField(fieldName); if (null != prop) { prop.SetValue(generator, parameterValues[fieldName]); } } GridInfo gridInfo = generator.GenerateGrid(); camera.transform.position = gridInfo.Center; camera.transform.position -= new Vector3(0, 0, (gridInfo.Dimensions.x > gridInfo.Dimensions.y ? gridInfo.Dimensions.x : gridInfo.Dimensions.y) * Mathf.Sqrt(3) / 2); if (mapType.Equals(MAP_TYPE_3D)) { var rotationVector = new Vector3(90f, 0f, 0f); camera.transform.parent = cellGrid.transform; cellGrid.transform.Rotate(rotationVector); players.transform.Rotate(rotationVector); units.transform.Rotate(rotationVector); directionalLight.transform.Rotate(rotationVector); camera.transform.parent = null; camera.transform.SetAsFirstSibling(); } }
private void MapGenerationGUI() { GUILayout.Label("Grid generation", EditorStyles.boldLabel); GUILayout.Label("Camera", EditorStyles.boldLabel); useMovableCamera = EditorGUILayout.Toggle("Use movable camera", useMovableCamera, new GUILayoutOption[0]); if (useMovableCamera) { cameraScrollSpeed = EditorGUILayout.FloatField(new GUIContent("Scroll Speed"), cameraScrollSpeed); cameraScrollEdge = EditorGUILayout.Slider("Scroll Edge", cameraScrollEdge, 0.05f, 0.25f, new GUILayoutOption[0]); } GUILayout.Label("Players", EditorStyles.boldLabel); nHumanPlayer = EditorGUILayout.IntField(new GUIContent("Human players No"), nHumanPlayer); nComputerPlayer = EditorGUILayout.IntField(new GUIContent("AI players No"), nComputerPlayer); GUILayout.Label("Grid", EditorStyles.boldLabel); mapTypeIndex = EditorGUILayout.Popup("Plane", mapTypeIndex, mapTypes, new GUILayoutOption[0]); GUI.changed = false; generatorIndex = EditorGUILayout.Popup("Generator", generatorIndex, generatorNames, new GUILayoutOption[0]); if (GUI.changed) { parameterValues = new Dictionary <string, object>(); } foreach (var field in generators[generatorIndex].GetFields().Where(f => f.IsPublic)) { if (field.FieldType == typeof(int)) { int x = 0; if (parameterValues.ContainsKey(field.Name)) { x = (int)(parameterValues[field.Name]); } x = EditorGUILayout.IntField(new GUIContent(field.Name), x); parameterValues[field.Name] = x; } else if (field.FieldType == typeof(GameObject)) { GameObject g = null; if (parameterValues.ContainsKey(field.Name)) { g = (GameObject)(parameterValues[field.Name]); } g = (GameObject)EditorGUILayout.ObjectField(field.Name, g, typeof(GameObject), false, new GUILayoutOption[0]); parameterValues[field.Name] = g; if (mapTypes[mapTypeIndex].Equals(MAP_TYPE_3D) && g != null && g.GetComponent <Collider2D>() != null) { shouldDisplayCollider2DWarning = true; } else { shouldDisplayCollider2DWarning = false; } } } if (shouldDisplayCollider2DWarning) { GUIStyle style = new GUIStyle(EditorStyles.wordWrappedLabel); style.fontStyle = FontStyle.Bold; style.normal.textColor = Color.red; GUILayout.Label("You are trying to generate a map on XZ plane with a prefab containg a 2D collider. 2D colliders will not work in XZ axis. Add a 3D collider to your tile prefab or select XY plane", style); } if (GUILayout.Button("Generate scene")) { Undo.ClearAll(); GenerateBaseStructure(); } if (GUILayout.Button("Clear scene")) { string dialogTitle = "Confirm delete"; string dialogMessage = "This will delete all objects on the scene. Do you wish to continue?"; string dialogOK = "Ok"; string dialogCancel = "Cancel"; bool shouldDelete = EditorUtility.DisplayDialog(dialogTitle, dialogMessage, dialogOK, dialogCancel); if (shouldDelete) { Undo.ClearAll(); GridHelperUtils.ClearScene(); } } }