Пример #1
0
        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();
            }
        }
Пример #2
0
        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();
                }
            }
        }