示例#1
0
    public override void OnInspectorGUI()
    {
        // Updates all serialized values at the beginning of the function.
        serializedObject.Update();

        // Get the CustomTerrain script.
        CustomTerrain terrain = (CustomTerrain)target;

        // Reset the terrain or not before generating a new terrain.
        EditorGUILayout.PropertyField(resetTerrain);

        // Create horizontal divider (slider) bar.
        EditorGUILayout.LabelField("", GUI.skin.horizontalSlider);

        // Create a foldout option in the inspector.
        showRandom = EditorGUILayout.Foldout(showRandom, "Random");

        // Foldout is open.
        if (showRandom)
        {
            // Create horizontal divider (slider) bar.
            EditorGUILayout.LabelField("", GUI.skin.horizontalSlider);

            // Create a label in the inspector.
            GUILayout.Label("Set Heights Between Random Values", EditorStyles.boldLabel);

            // Display the property field.
            EditorGUILayout.PropertyField(randomHeightRange);

            // Generate random terrain height map.
            if (GUILayout.Button("Random Heights"))
            {
                // Create a random terrain.
                terrain.RandomTerrain();
            }

            // Create horizontal divider (slider) bar.
            EditorGUILayout.LabelField("", GUI.skin.horizontalSlider);
        }

        showLoadHeights = EditorGUILayout.Foldout(showLoadHeights, "Load Heights");

        if (showLoadHeights)
        {
            // Create horizontal divider (slider) bar.
            EditorGUILayout.LabelField("", GUI.skin.horizontalSlider);

            GUILayout.Label("Load Heights From Texture", EditorStyles.boldLabel);

            EditorGUILayout.PropertyField(heightMapImage);

            EditorGUILayout.PropertyField(heightMapScale);

            if (GUILayout.Button("Load Texture"))
            {
                terrain.LoadTexture();
            }

            // Create horizontal divider (slider) bar.
            EditorGUILayout.LabelField("", GUI.skin.horizontalSlider);
        }

        showPerlinNoise = EditorGUILayout.Foldout(showPerlinNoise, "Single Perlin Noise");

        if (showPerlinNoise)
        {
            // Create horizontal divider (slider) bar.
            EditorGUILayout.LabelField("", GUI.skin.horizontalSlider);

            GUILayout.Label("Perlin Noise", EditorStyles.boldLabel);

            EditorGUILayout.Slider(perlinXScale, 0, 1, new GUIContent("X Scale"));
            EditorGUILayout.Slider(perlinYScale, 0, 1, new GUIContent("Y Scale"));

            EditorGUILayout.IntSlider(perlinOffsetX, 0, 10000, new GUIContent("Offset X"));
            EditorGUILayout.IntSlider(perlinOffsetY, 0, 10000, new GUIContent("Offset Y"));

            EditorGUILayout.IntSlider(perlinOctaves, 0, 10, new GUIContent("Octaves"));

            EditorGUILayout.Slider(perlinPersistance, 0, 10, new GUIContent("Persistance"));

            EditorGUILayout.Slider(perlinHeightScale, 0, 1, new GUIContent("Height Scale"));

            if (GUILayout.Button("Simple Perlin"))
            {
                terrain.SimplePerlin();
            }

            if (GUILayout.Button("Fractal Brownian Motion Perlin"))
            {
                terrain.FractaBrownianMotionPerlin();
            }

            // Create horizontal divider (slider) bar.
            EditorGUILayout.LabelField("", GUI.skin.horizontalSlider);
        }

        showMultiplePerlinNoise = EditorGUILayout.Foldout(showMultiplePerlinNoise, "Multiple Perlin Noise");

        if (showMultiplePerlinNoise)
        {
            // Create horizontal divider (slider) bar.
            EditorGUILayout.LabelField("", GUI.skin.horizontalSlider);

            GUILayout.Label("Multiple Perlin Noise", EditorStyles.boldLabel);

            perlinParameterTable = GUITableLayout.DrawTable(perlinParameterTable, serializedObject.FindProperty("perlinParameters"));

            GUILayout.Space(20);

            EditorGUILayout.BeginHorizontal();

            if (GUILayout.Button("+"))
            {
                terrain.AddNewPerlin();
            }

            if (GUILayout.Button("-"))
            {
                terrain.RemovePerlin();
            }

            EditorGUILayout.EndHorizontal();

            if (GUILayout.Button("Apply Multiple Perlin"))
            {
                terrain.MultiplePerlin();
            }

            // Create horizontal divider (slider) bar.
            EditorGUILayout.LabelField("", GUI.skin.horizontalSlider);
        }

        // Create a foldout option in the inspector.
        showVoronoi = EditorGUILayout.Foldout(showVoronoi, "Voronoi");

        // Foldout is open.
        if (showVoronoi)
        {
            // Create horizontal divider (slider) bar.
            EditorGUILayout.LabelField("", GUI.skin.horizontalSlider);

            EditorGUILayout.IntSlider(voronoiPeaks, 1, 10, new GUIContent("Peak Count"));

            EditorGUILayout.Slider(voronoiFallOff, 0.0f, 10.0f, new GUIContent("Fall Off"));
            EditorGUILayout.Slider(voronoiDropOff, 0.0f, 10.0f, new GUIContent("Drop Off"));

            EditorGUILayout.Slider(voronoiMinimumHeight, 0.0f, 1.0f, new GUIContent("Minimum Height"));
            EditorGUILayout.Slider(voronoiMaximumHeight, 0.0f, 1.0f, new GUIContent("Maximum Height"));

            EditorGUILayout.PropertyField(voronoiType);

            // Generate random terrain height map.
            if (GUILayout.Button("Voronoi"))
            {
                // Create a random terrain.
                terrain.Voronoi();
            }

            // Create horizontal divider (slider) bar.
            EditorGUILayout.LabelField("", GUI.skin.horizontalSlider);
        }

        showMidpointDisplacement = EditorGUILayout.Foldout(showMidpointDisplacement, "Midpoint Displacement");

        if (showMidpointDisplacement)
        {
            // Create horizontal divider (slider) bar.
            EditorGUILayout.LabelField("", GUI.skin.horizontalSlider);

            EditorGUILayout.PropertyField(midpointHeightMinimum);
            EditorGUILayout.PropertyField(midpointHeightMaximum);
            EditorGUILayout.PropertyField(midpointHeightDampenerPower);
            EditorGUILayout.PropertyField(midpointRoughness);

            if (GUILayout.Button("Midpoint Displacement"))
            {
                terrain.MidpointDisplacement();
            }

            // Create horizontal divider (slider) bar.
            EditorGUILayout.LabelField("", GUI.skin.horizontalSlider);
        }

        showSmooth = EditorGUILayout.Foldout(showSmooth, "Smooth");

        if (showSmooth)
        {
            // Create horizontal divider (slider) bar.
            EditorGUILayout.LabelField("", GUI.skin.horizontalSlider);

            if (GUILayout.Button("Smooth"))
            {
                terrain.Smooth();
            }

            // Create horizontal divider (slider) bar.
            EditorGUILayout.LabelField("", GUI.skin.horizontalSlider);
        }

        // Reset terrain height map to zero.
        if (GUILayout.Button("Reset Heights"))
        {
            // Reset the terrain.
            terrain.ResetTerrain();
        }

        // Apply new changes at the end of the function.
        serializedObject.ApplyModifiedProperties();

        return;
    }