首先,我们需要一些值来存储缩放值,而这些是我们将其发送到噪声函数以确定幅度的间隔,如上一篇所讲,随着增量值的变大,噪音曲线将变得更加平滑
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.Linq;
using UnityEditor;
public class CustomTerrain : MonoBehaviour {
//首先,我们需要一些值来存储缩放值,而这些是我们将其发送到噪声函数以确定幅度的间隔,
//如上一篇所讲,随着增量值的变大,噪音曲线将变得更加平滑
//PERLIN NOISE ----------------------------------------------
public float perlinXScale = 0.01f;
public float perlinYScale = 0.01f;
//获取地形(物体)对象
public Terrain terrain;
//TerrainData里有地形所有的数据
public TerrainData terrainData;
//每次编辑完脚本内容返回编辑器时运行后会执行此方法
private void OnEnable()
{
//初始化地形数据 先获取地形再获取本身的地形数据
terrain = gameObject.GetComponent<Terrain>();
terrainData = Terrain.activeTerrain.terrainData;
}
public void Perlin()
{
float[,] heightMap = terrainData.GetHeights(0, 0, terrainData.heightmapWidth,
terrainData.heightmapHeight);
for (int y = 0; y < terrainData.heightmapHeight; y++)
{
for (int x = 0; x < terrainData.heightmapWidth; x++)
{
//将x y直输到噪声函数中,因为要基于地图上的位置生成噪声值
//如果不乘以x y,Mathf.PerlinNoise返回的是相同值,整个地图高度相同
heightMap[x, y] = Mathf.PerlinNoise(x*perlinXScale,y*perlinYScale);
}
}
terrainData.SetHeights(0, 0, heightMap);
}
}
编辑面板序列化属性:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(CustomTerrain))]
public class CustomTerrainEditor : Editor {
SerializedProperty perlinXScale;
SerializedProperty perlinYScale;
bool showPerlinNoise = false;
private void OnEnable()
{
//找到需要反复更改的属性
perlinXScale = serializedObject.FindProperty("perlinXScale");
perlinYScale = serializedObject.FindProperty("perlinYScale");
}
//绘制编辑面板
public override void OnInspectorGUI()
{
//更新所有序列化的值
serializedObject.Update();
//获取自定义的地形属性脚本组件
CustomTerrain terrain = (CustomTerrain)target;
#region
showPerlinNoise = EditorGUILayout.Foldout(showPerlinNoise, "Single Perlin Noise");
if (showPerlinNoise)
{
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"));
if (GUILayout.Button("Perlin"))
{
terrain.Perlin();
}
}
#endregion
//应用发生的所有更改
serializedObject.ApplyModifiedProperties();
}
}
结果:
改不同值有不同效果
下面添加部分代码实现地形整体沿X和y偏移