예제 #1
0
    private void Start()
    {
        //BENCHMARK************************************************************************

        var watch = Stopwatch.StartNew();


        var testMap = GenerateAreaDrunkardWalk();

        watch.Stop();

        UnityEngine.Debug.Log("Time creating C# test map: " + watch.ElapsedMilliseconds);

        watch.Reset();
        watch.Start();
        testMap = Procedural2DHelper.CreateDrunkardWalkArea(1000, 1000, 0, 0, 100000);
        watch.Stop();
        UnityEngine.Debug.Log("Time creating C++ test map: " + watch.ElapsedMilliseconds);



        //Actual map creation***************************************************************
        watch.Reset();
        watch.Start();

        var map = Procedural2DHelper.CreateBSPDungeonArea(100, 100, 0, 0, 10, 100, 1, 1);

        watch.Stop();
        UnityEngine.Debug.Log("Time elapsed creating map: " + watch.ElapsedMilliseconds);


        watch.Reset();
        watch.Start();
        MapDrawer.DrawMapWithTileMap(map);
        watch.Stop();
        UnityEngine.Debug.Log("Time creating tile map: " + watch.ElapsedMilliseconds);
        watch.Reset();
    }
예제 #2
0
    public void OnEnable()
    {
        #region Initialization
        if (data == null)
        {
            data = Resources.Load <ProceduralDataObject>("data");
        }
        // Each editor window contains a root VisualElement object
        VisualElement root = rootVisualElement;



        // Import UXML
        var           visualTree = AssetDatabase.LoadAssetAtPath <VisualTreeAsset>("Assets/Procedural++/Editor/MapCreatorWindow.uxml");
        VisualElement uxml       = visualTree.CloneTree();


        //Import Stylesheet
        var styleSheet = AssetDatabase.LoadAssetAtPath <StyleSheet>("Assets/Procedural++/Editor/MapCreatorWindow.uss");
        uxml.styleSheets.Add(styleSheet);
        root.Add(uxml);

        #endregion

        #region Buttons
        Button createButton = root.Query <Button>("createMap");
        createButton.clickable.clicked += () => {
            switch ((MapType)enumFieldMap.value)
            {
            case MapType.RandomNoise:
                previousArea = Procedural2DHelper.CreateRandomNoiseArea((int)sliderX.value, (int)sliderY.value, 0, 0);
                break;

            case MapType.Drunkard:
                previousArea = Procedural2DHelper.CreateDrunkardWalkArea((int)sliderX.value, (int)sliderY.value, 0, 0, iterationsDrunkard);
                break;

            case MapType.BSPDungeon:
                previousArea = Procedural2DHelper.CreateBSPDungeonArea((int)sliderX.value, (int)sliderY.value, 0, 0, minRooms, maxRooms, minWidth, minHeight);
                break;

            case MapType.SimpleDungeon:
                previousArea = Procedural2DHelper.CreateSimpleDungeonArea((int)sliderX.value, (int)sliderY.value, 0, 0, tryRooms, extraCorridors, minWidthS, maxWidth, minHeightS, maxHeight);
                break;

            case MapType.CellularAutomata:
                previousArea = Procedural2DHelper.CreateCellularAutomataArea((int)sliderX.value, (int)sliderY.value, cellularConfiguration.probabilities.ToArray(), 0, 0, cellularConfiguration.iterations, cellularConfiguration.numberOfTIles);
                break;
            }


            MapDrawer.DrawMapWithTileMap(previousArea);

            EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene());
        };

        Button clearButton = root.Query <Button>("clearMap");
        clearButton.clickable.clicked += () =>
        {
            MapDrawer.ClearTileMap();
        };

        Button saveButton = root.Query <Button>("saveMap");

        saveButton.clickable.clicked += () =>
        {
            if (previousArea.tileInfo != null)
            {
                string name = EditorUtility.SaveFilePanel("Save map", "./Assets", "DataMap", "bin");
                if (name != null)
                {
                    IFormatter formatter = new BinaryFormatter();
                    Stream     stream    = new FileStream(name, FileMode.Create, FileAccess.Write, FileShare.None);
                    formatter.Serialize(stream, previousArea);
                    stream.Close();
                }
            }
            else
            {
                Debug.Log("Generate an Area before saving!");
            }
        };


        Button loadButton = root.Query <Button>("loadMap");
        loadButton.clickable.clicked += () =>
        {
            string name = EditorUtility.OpenFilePanel("Load Map", "./Assets", "bin");
            if (name != null)
            {
                IFormatter formatter = new BinaryFormatter();
                Stream     stream    = new FileStream(name, FileMode.Open, FileAccess.Read, FileShare.Read);
                previousArea = (Area)formatter.Deserialize(stream);
                MapDrawer.DrawMapWithTileMap(previousArea);
                stream.Close();
            }
        };

        #endregion

        #region SizeSliders
        sliderX        = root.Query <Slider>("sizeX");
        sizeXText      = root.Query <Label>("sizeXText");
        sizeXText.text = ((int)sliderX.value).ToString() + " size X";
        sliderX.RegisterValueChangedCallback((t) =>
        {
            sizeXText.text = ((int)t.newValue).ToString() + " size X";
        });

        sliderY        = root.Query <Slider>("sizeY");
        sizeYText      = root.Query <Label>("sizeYText");
        sizeYText.text = ((int)sliderY.value).ToString() + " size Y";

        sliderY.RegisterValueChangedCallback((t) =>
        {
            sizeYText.text = ((int)t.newValue).ToString() + " size Y";
        });

        #endregion

        #region Default General Data
        ObjectField field = root.Query <ObjectField>("tileColision");
        field.objectType = typeof(Tile);
        field.value      = data.defaultCollisionTile;

        ObjectField fieldFloor = root.Query <ObjectField>("tileFloor");
        fieldFloor.objectType = typeof(Tile);
        fieldFloor.value      = data.defaultFreeTile;

        field.RegisterValueChangedCallback((t) =>
        {
            data.defaultCollisionTile = (Tile)t.newValue;
        });

        fieldFloor.RegisterValueChangedCallback((t) =>
        {
            data.defaultFreeTile = (Tile)t.newValue;
        });


        Toggle toggle = root.Query <Toggle>("autoClear");
        toggle.value = data.autoClearTileMap;
        toggle.RegisterValueChangedCallback((t) =>
        {
            data.autoClearTileMap = t.newValue;
        });

        #endregion

        #region Map Specific Data
        parentMapSpecificData = root.Query <Box>("rootMapSpecific");
        Slider iterations = new Slider(5000, 1000000);
        iterations.label = "Iterations (5000)";
        iterations.value = iterationsDrunkard;
        iterations.RegisterValueChangedCallback((t) =>
        {
            iterations.label   = "Iterations (" + (int)t.newValue + ")";
            iterationsDrunkard = (int)t.newValue;
        });
        parentMapSpecificData.Add(iterations);



        enumFieldMap = root.Query <EnumField>("mapSelector");
        enumFieldMap.Init(MapType.Drunkard);
        enumFieldMap.RegisterValueChangedCallback((t) =>
        {
            var newValue = (MapType)t.newValue;

            switch (newValue)
            {
            case MapType.RandomNoise:
                RemoveChildsFromMapSpecificParent();
                break;

            case MapType.Drunkard:
                DrunkardEnumSwitch();
                break;

            case MapType.BSPDungeon:
                BSPDungeonSwitch();
                break;

            case MapType.SimpleDungeon:
                SimpleDungeonSwitch();
                break;

            case MapType.CellularAutomata:
                CellularAutomataSwitch();
                break;
            }
        });

        #endregion
    }