Terrain Editor
启动Terrain Editor
-
创建Terrain: 在Unity的Hierarchy视图中,右键选择
Create > 3D Object > Terrain
来创建一个新的Terrain对象。 -
打开Terrain Inspector: 选择Hierarchy中的Terrain对象,Inspector视图会显示Terrain的各种属性和工具。
从左到右这些按钮的功能是:
- Create Neighbor Terrains(创建相邻地形):这个工具允许你创建与当前地形平铺相接的新地形块,方便地形的扩展和连续性管理。
- Paint Terrain(绘制地形):这是用于修改地形高度或应用不同的地表纹理的工具。可以雕塑地形的高低起伏或给地面涂上不同的纹理材料。
- Paint Trees(种植树木):此工具允许你在地形上放置和管理树木和其他类似的细节物件,如草和灌木。
- Paint Details(绘制细节):用于在地形上添加更细小的装饰性细节,例如草丛、小花或其他小型植被。
- Terrain Settings(地形设置):提供了一系列设置,让你能够调整地形的基本属性,如分辨率、材质设置、地形的物理属性等。
Terrain Settings
Basic Terrain
-
Grouping ID: 用于识别属于同一组的多个地形对象。当你有多块地形需要协同处理时,这个设置非常有用。
-
Auto Connect: 当这个选项被勾选时,具有相同Grouping ID的地形会自动连接在一起,形成一个连续的大地形。
-
Draw: 控制地形是否被渲染。如果取消勾选,地形将不会在游戏中显示,可以用于临时隐藏地形进行测试。
-
Draw Instanced: 如果勾选,地形将使用GPU实例化渲染,这可以显著提高渲染多个地形块时的性能。
-
Enable Ray Tracing: 如果勾选,地形将支持光线追踪技术,增强光影效果。这需要硬件支持并可能影响性能。
-
Pixel Error: 控制地形的细节层次与视距的关系。数值越小,地形从远处看起来越精细,但渲染成本也越高。
-
Base Map Dist.: 基础贴图的绘制距离,设置地形贴图在多远的距离下转为基础贴图,以优化性能。
-
Cast Shadows:
关闭(Off):完全禁用地形的阴影投射。这意味着地形在场景中不会产生任何阴影,这在不需要阴影或为了优化性能的情景中很有用。开启(On):启用地形的阴影投射,使用默认设置。地形将根据场景中设置的光照条件投射阴影。
双面(Two Sided):允许地形从顶部和底部两个表面投射阴影。这个选项在地形的底面也可能可见且应该投射阴影的情况下非常有用。
仅阴影(Shadows Only):此设置使地形只投射阴影,而不在场景中渲染地形的表面。这在优化性能时很有用,比如当不需要地形的视觉呈现但需要其通过阴影影响光照的情况。
-
Reflection Probes: 控制地形如何与环境反射探头交互。
关闭(Off):此选项将禁用地形的反射探针。地形将不会接收任何反射探针的影响,这可能用于优化性能或当场景设计中不需要反射时。混合探针(Blend Probes):地形将使用场景中存在的多个反射探针,并在它们之间进行混合。这可以在地形跨越多个反射探针区域时创建更平滑和逼真的反射效果。
混合探针和天空盒(Blend Probes and Skybox):除了使用和混合场景中的反射探针外,还会考虑天空盒在计算反射时的影响。这增加了视觉上的丰富性,尤其是在开阔的室外环境中,可以更真实地反映天空和远处对象。
简单(Simple):此选项提供一种基本的反射处理方式,通常用于对性能要求较高的场景,不需要复杂的探针混合,只利用最近的单个反射探针的数据。
-
Material: 显示当前地形使用的材质。可以选择现有材质或通过点击“Create…”创建新的材质。通常使用“TerrainLit”材质,它特别为地形渲染优化。
Tree & Detail Objects
这里可以添加和配置地形上的树木和细节对象,如草和小植被。你可以控制这些对象的密度、分布以及它们如何随风动作。
-
绘制(Draw):勾选此项会在地形上显示树木和细节物体。
-
烘焙光照探针(Bake Light Probes):启用此项允许树木和细节物体使用光照探针的数据,这可以改善场景的光照效果,使植被更自然地融入周围环境。
-
移除光照探针(Remove Light Probes):此选项允许在地形修改时自动从光照探针的影响中移除树木和细节物体。
-
保留树木原型(Preserve Tree Prototypes):启用此项可以在编辑地形时保留树木的原始模型设置,避免因地形编辑造成的树木属性丢失。
-
树木运动矢量(Tree Motion Vector):控制树木受风的影响方式,可以选择“从原型继承”(Inherit From Prototype),这意味着树木的运动将基于它们原型的设置。
-
细节距离(Detail Distance):定义了地形细节物体(如草)的最大可视距离,单位为米。
-
细节密度比例(Detail Density Scale):控制地形上细节物体的整体密度,值越大显示的细节物体越多。
-
树木距离(Tree Distance):设置树木在地形上的最大渲染距离,超出这个距离的树木将不会被渲染。
-
广告牌起始(Billboard Start):树木在远距离时开始使用广告牌效果的距离,广告牌效果是一种优化技术,用于提升远处树木的渲染效率。
-
淡出长度(Fade Length):控制树木从完全渲染到只显示广告牌效果的过渡区域长度。
-
最大网格树木(Max Mesh Trees):设置在地形上可以使用完整3D模型的树木的最大数量。
-
细节散布模式(Detail Scatter Mode):定义细节物体在地形上的散布模式,如“覆盖模式”(Coverage Mode)将根据地形的覆盖层设置细节物体的分布。
Wind Settings for Grass
调整影响地形上草和其他细节对象的风的设置,包括风的强度、方向和风对这些细节对象的影响程度。
-
Speed:
- 控制风的速度。
- 较高的值会使草在风中摆动得更快。
-
Size:
- 控制风的影响范围。
- 较高的值会使更大范围的草受到风的影响。
-
Bending:
- 控制草在风中的弯曲程度。
- 较高的值会使草在风中弯曲得更多。
-
Grass Tint:
- 控制草的颜色。
- 你可以选择一个颜色来调整草的外观。
Mesh Resolution (On Terrain Data)
设置地形网格的分辨率。高分辨率的网格允许更复杂的地形形状,但可能会降低性能。
- Terrain Width:
- 地形的宽度(以世界单位计)。
- Terrain Length:
- 地形的长度(以世界单位计)。
- Terrain Height:
- 地形的最大高度(以世界单位计)。
- 这个设置定义了地形在Y轴方向上的最大高度,也就是说,地形从最低点到最高点的高度差。
- Detail Resolution Per Patch:
- 每个补丁的细节分辨率。
- 这个设置定义了每个地形补丁(Patch)的细节分辨率。较高的值会提供更多的细节,但会增加计算量和渲染负担。
- Detail Resolution:
- 细节分辨率。
- 这个设置定义了整个地形的细节分辨率。较高的值会使地形的细节更加丰富,但同样会增加计算量和渲染负担。
Holes Settings (On Terrain Data)
此设置用于在地形中创建“洞”,即地形的某部分可以透明或被完全移除,通常用于创建如湖泊和河流的地形特征。
- Compress Holes Texture:
- 选项描述:启用或禁用地形洞的纹理压缩。
- 当勾选此选项时,地形洞的纹理将被压缩,从而减少纹理的内存占用和提高渲染性能。
- 当你在地形上创建洞时,Unity会生成一个洞的纹理贴图,用于标记地形哪些部分应该被渲染为空洞。
- 这对于大型地形或具有多个洞的复杂地形尤其有用,因为可以有效地管理资源和性能。
如果你在创建具有大量洞的地形时遇到性能问题,可以尝试启用这个选项。
Texture Resolutions (On Terrain Data)
在这个部分,你可以设置地形的纹理分辨率。这影响地形的贴图如何被渲染,是影响性能和视觉质量的重要因素。
-
Heightmap Resolution:
- 决定了地形的高度图的精细程度。较高的分辨率可以提供更多的高度细节,但也会增加内存和计算负担。
-
Control Texture Resolution:
- 决定了控制纹理的精细程度。控制纹理用于定义地形上的不同区域(例如,草地、泥土、沙地等)的混合方式。较高的分辨率可以提供更细致的区域控制,但也会增加内存和计算负担。
-
Base Texture Resolution:
- 基础纹理分辨率,定义地形基础纹理的分辨率。
- 决定了基础纹理的清晰度。基础纹理是应用在整个地形上的纹理,较高的分辨率可以提供更清晰的地形外观,但也会增加内存和计算负担。
-
Import Raw / Export Raw:
- 用于导入和导出地形高度图的原始数据(RAW文件格式)。
- 通过这些按钮,你可以将高度图数据导入或导出,进行进一步编辑或备份。
Lighting
控制地形的光照设置,如地形的光照模型(如使用标准光照或简化光照)以及地形如何接收和反射光。
-
Contribute Global Illumination:
- 选项描述:启用或禁用地形对全局光照的贡献。
- 勾选此选项后,地形会参与全局光照的计算,这样会使光线在地形上的反射和散射效果更加逼真,从而提升整体的光照质量。
-
Receive Global Illumination:
- 选项描述:控制地形接收全局光照的方式。
- 选项包括“Lightmaps”和“Light Probe”。
- Lightmaps:选择此选项时,地形会使用预计算的光照贴图来接收全局光照。这种方法通常在场景光照静态且光照效果需要高质量时使用。
- Light Probes:选择此选项时,地形会使用光探针来接收全局光照。光探针捕获场景中不同位置的光照信息,适用于动态场景和移动对象。
Lightmapping
允许地形参与全局光照计算和光照贴图。你可以选择地形的渲染层遮罩,这影响哪些光源会影响地形。此外,你还可以选择忽略品质设置,这通常用于优化,可以针对不同的硬件配置提供不同的渲染品质。
- Rendering Layer Mask:
- 渲染层蒙版用于控制地形在渲染过程中应用的层。可以将地形分配到特定的渲染层,以便在光照贴图烘焙和渲染过程中进行更细粒度的控制。
- 可以在项目的图层设置中定义和选择其他自定义的渲染层。
图片显示的是Unity Terrain组件中的“Quality Settings”部分。具体设置项如下:
Quality Settings
- Ignore Quality Settings:
- 作用:当此选项被勾选时,地形将忽略Unity项目中的全局质量设置,并使用地形自身的质量设置。这允许你为特定地形单独定义质量设置,而不受全局设置的影响。
- 使用场景:如果你希望为特定的地形对象提供不同于全局质量设置的配置,比如在一个场景中有多个地形对象,每个地形对象需要不同的渲染质量,这时就可以启用此选项。
图片显示的是Unity Terrain组件中的“Create Neighbor Terrains”设置部分,用于创建相邻的地形。具体设置项如下:
Create Neighbor Terrains
-
Fill Heightmap Using Neighbor:
- 作用:当启用此选项时,Unity会使用相邻地形的数据来填充新创建的地形高度图。这有助于确保相邻地形之间的高度过渡平滑,从而避免出现明显的边界或不连续的地形变化。
- 使用场景:在创建大型连续地形时,启用此选项可以使多个地形片段无缝连接,提供更自然的过渡效果。
-
Fill Heightmap Address Mode:
- Clamp:使用相邻地形的边缘高度填充新地形的高度图边缘。边缘值被“钳制”到最近的相邻高度值。
- Wrap:高度图在边缘处循环,创建连续的周期性高度变化。
- Mirror:高度图在边缘处反射,创建镜像的高度变化。
示例代码
假设你想通过脚本动态设置地形的这些选项,可以使用以下代码:
using UnityEngine;
public class AdjustNeighborTerrains : MonoBehaviour
{
public Terrain terrain;
public bool fillHeightmapUsingNeighbor = true;
public TerrainFillAddressMode fillHeightmapAddressMode = TerrainFillAddressMode.Clamp;
void Start()
{
if (terrain == null)
{
terrain = GetComponent<Terrain>();
}
// 设置是否使用相邻地形填充高度图
terrain.allowAutoConnect = fillHeightmapUsingNeighbor;
// 设置填充高度图的地址模式
terrain.terrainData.heightmapAddressMode = fillHeightmapAddressMode;
}
}
public enum TerrainFillAddressMode
{
Clamp,
Wrap,
Mirror
}
在这个示例中,fillHeightmapUsingNeighbor
设置为true
表示启用使用相邻地形填充高度图,fillHeightmapAddressMode
设置为Clamp
表示使用“Clamp”地址模式。
Paint Terrain
Paint Texture
工具用于在地形上应用和绘制不同的纹理。这可以帮助你创建多样化的地形外观,例如草地、泥土、沙地等。
设置和使用 Paint Texture 工具
Brushes(刷子)
- 选择刷子:在
Brushes
部分选择一个刷子形状。Unity 提供了多种默认的刷子形状,如圆形、方形等。你也可以创建自定义刷子。 - 新建刷子:点击
New Brush...
按钮可以创建自定义刷子。
Brush Mask(刷子遮罩)
- 这个部分允许你应用一个遮罩来限制刷子的作用区域。比如,可以使用噪声遮罩来创造更自然的过渡。
Stroke(笔触)
- Target Strength:控制刷子的强度,即应用纹理的强度。你可以通过滑块来调整这个值。
Material(材质)
- 在
Material
部分,你可以选择地形的材质。通常,地形材质会包含多层纹理,用于不同的地形类型。
Layers(层)
- Layer Palette Profile:保存和加载纹理层配置。
- Layer Palette:显示当前地形的纹理层。可以在这里添加、移除和管理纹理层。
创建新层
- 点击
Add Layer
按钮来添加新的纹理层。 - 在弹出的窗口中选择你想要应用的纹理,或者创建一个新的纹理。
绘制纹理
- 选择纹理层:在
Layer Palette
中选择你要绘制的纹理层。 - 选择刷子:在
Brushes
部分选择一个刷子形状。 - 调整刷子参数:调整
Target Strength
和其他参数,以获得所需的效果。 - 绘制:在地形上点击并拖动鼠标,应用选定的纹理。
图层管理
- 添加图层:点击
Add Layer
按钮并选择或创建一个新的纹理层。 - 移除图层:选择一个图层并点击
Remove Layer
按钮。 - 调整图层顺序:在
Layer Palette
中拖动图层条目以调整它们的绘制顺序。
示例:绘制草地纹理
- 在
Layers
部分,点击Add Layer
并选择一个草地纹理。 - 在
Brushes
部分选择一个柔和的圆形刷子。 - 调整
Target Strength
到适当的值,比如 0.5。 - 在地形上点击并拖动鼠标,绘制草地纹理。
Paint Trees
设置和使用 Paint Trees
工具
添加树木原型
- 点击
Edit Trees...
按钮:在Trees
部分,点击Edit Trees...
按钮,然后选择Add Tree...
。 - 选择树木预制件:在弹出的窗口中,点击
GameObject
下拉菜单,选择一个树木预制件(Prefab)。你可以使用Unity提供的默认树木预制件,或者导入和创建自己的树木预制件。 - 设置树木参数:你可以调整树木的参数,如最大高度、最小高度、颜色等。
设置刷子参数
- Brush Size:调整刷子的大小。这个参数控制你在地形上种植树木时的影响范围。
- Tree Density:调整树木密度。这个参数控制在刷子范围内种植的树木数量。
- Color Variance:设置树木颜色的变化范围。
- Height:调整树木高度的范围。
- 树木高度:设置树木的高度范围,以控制生成的树木大小。
- Random Tree Rotation:勾选此选项,树木将以随机旋转角度种植,使它们看起来更加自然。
- Lock Width to Height:勾选此选项,树木的宽度和高度将按比例锁定。
在地形上种植树木
- 选择树木类型:在
Trees
部分,选择你想要种植的树木类型。 - 调整刷子参数:调整
Brush Size
、Tree Density
、Color Variance
和Height
参数。 - 种植树木:在地形上点击并拖动鼠标,种植树木。
- 移除树木:按住
Ctrl
键并拖动鼠标,可以移除已种植的树木。
示例操作
示例:种植松树
- 添加树木原型:点击
Edit Trees...
按钮,然后选择Add Tree...
。在弹出的窗口中,选择一个松树预制件。 - 设置刷子参数:调整
Brush Size
到适中的大小(例如 30),将Tree Density
设置为高密度(例如 50)。 - 种植树木:在地形上点击并拖动鼠标,种植松树。你会看到在刷子范围内生成了许多松树。
- 调整高度和颜色:在
Height
部分设置树木的高度范围(例如 4 到 8),并在Color Variance
部分调整颜色变化范围,使树木看起来更加自然。
示例代码
假设你想通过脚本动态添加树木,可以使用以下代码:
using UnityEngine;
public class AddTreesToTerrain : MonoBehaviour
{
public Terrain terrain;
public GameObject treePrefab;
public int treeCount = 100;
public float areaSize = 100f;
void Start()
{
if (terrain == null)
{
terrain = GetComponent<Terrain>();
}
TerrainData terrainData = terrain.terrainData;
for (int i = 0; i < treeCount; i++)
{
float x = Random.Range(0, areaSize) / terrainData.size.x;
float z = Random.Range(0, areaSize) / terrainData.size.z;
float y = terrainData.GetHeight((int)(x * terrainData.heightmapResolution), (int)(z * terrainData.heightmapResolution)) / terrainData.size.y;
TreeInstance treeInstance = new TreeInstance
{
position = new Vector3(x, y, z),
prototypeIndex = 0,
widthScale = Random.Range(0.8f, 1.2f),
heightScale = Random.Range(0.8f, 1.2f),
color = Color.Lerp(Color.white, Color.green, Random.value),
lightmapColor = Color.white
};
terrainData.AddTreeInstance(treeInstance);
}
terrainData.RefreshPrototypes();
}
}
在这个示例中,treePrefab
是你要种植的树木预制件,treeCount
是你要种植的树木数量,areaSize
是种植树木的区域大小。脚本会在指定区域内随机位置种植树木。
Paint Details
在Unity中,使用Paint Details
工具可以在地形上添加草地、花朵和其他细小的植被或细节对象。
设置和使用 Paint Details
工具
添加细节对象原型
- 点击
Edit Details...
按钮:在Details
部分,点击Edit Details...
按钮,然后选择Add Grass Texture...
或Add Detail Mesh...
。 - 选择细节对象:在弹出的窗口中,选择一个草地纹理或细节网格(例如,花朵、灌木)。你可以使用Unity提供的默认细节对象,或者导入和创建自己的细节对象。
- 设置细节对象参数:你可以调整细节对象的参数,如渲染模式、最小和最大宽度、高度等。
添加草地纹理示例:
- 点击
Add Grass Texture...
。 - 选择草地纹理:在弹出的窗口中,选择一个草地纹理。
- 设置草地参数:
- Detail Texture:选择草地的纹理。
- Min Width 和 Max Width:设置草地的最小和最大宽度。
- Min Height 和 Max Height:设置草地的最小和最大高度。
- Healthy Color 和 Dry Color:设置草地的健康颜色和干燥颜色。
- Render Mode:选择草地的渲染模式(例如,草地或细节网格)。
添加细节网格示例:
- 点击
Add Detail Mesh...
。 - 选择细节网格:在弹出的窗口中,选择一个细节网格(例如,花朵或灌木)。
- 设置细节网格参数:
- Detail Mesh:选择细节对象的网格。
- Min Width 和 Max Width:设置细节对象的最小和最大宽度。
- Min Height 和 Max Height:设置细节对象的最小和最大高度。
- Healthy Color 和 Dry Color:设置细节对象的健康颜色和干燥颜色。
- Render Mode:选择细节对象的渲染模式(例如,草地或细节网格)。
设置刷子参数
- Brush Size:调整刷子的大小。这个参数控制你在地形上添加细节对象时的影响范围。
- Opacity:调整刷子的透明度。这个参数控制细节对象的密度。
- Target Strength:调整细节对象的强度。
在地形上添加细节对象
- 选择细节对象类型:在
Details
部分,选择你想要添加的细节对象类型。 - 调整刷子参数:调整
Brush Size
、Opacity
和Target Strength
参数。 - 添加细节对象:在地形上点击并拖动鼠标,添加细节对象。
- 移除细节对象:按住
Ctrl
键并拖动鼠标,可以移除已添加的细节对象。
示例操作
示例:添加草地
- 添加草地纹理:点击
Edit Details...
按钮,然后选择Add Grass Texture...
。在弹出的窗口中选择一个草地纹理,并设置草地参数。 - 设置刷子参数:调整
Brush Size
到适中的大小(例如 20),将Opacity
设置为较高值(例如 0.8)。 - 添加草地:在地形上点击并拖动鼠标,添加草地。你会看到在刷子范围内生成了许多草地。
示例:添加花朵
- 添加细节网格:点击
Edit Details...
按钮,然后选择Add Detail Mesh...
。在弹出的窗口中选择一个花朵网格,并设置花朵参数。 - 设置刷子参数:调整
Brush Size
到适中的大小(例如 10),将Opacity
设置为较低值(例如 0.5)。 - 添加花朵:在地形上点击并拖动鼠标,添加花朵。你会看到在刷子范围内生成了许多花朵。
示例代码
假设你想通过脚本动态添加细节对象,可以使用以下代码:
using UnityEngine;
public class AddDetailsToTerrain : MonoBehaviour
{
public Terrain terrain;
public Texture2D grassTexture;
public GameObject detailMesh;
void Start()
{
if (terrain == null)
{
terrain = GetComponent<Terrain>();
}
TerrainData terrainData = terrain.terrainData;
// 添加草地纹理
DetailPrototype grassPrototype = new DetailPrototype();
grassPrototype.prototypeTexture = grassTexture;
grassPrototype.renderMode = DetailRenderMode.Grass;
grassPrototype.minWidth = 0.5f;
grassPrototype.maxWidth = 1.5f;
grassPrototype.minHeight = 0.5f;
grassPrototype.maxHeight = 1.5f;
grassPrototype.healthyColor = Color.green;
grassPrototype.dryColor = Color.yellow;
// 添加细节网格
DetailPrototype meshPrototype = new DetailPrototype();
meshPrototype.prototype = detailMesh;
meshPrototype.renderMode = DetailRenderMode.VertexLit;
meshPrototype.minWidth = 0.8f;
meshPrototype.maxWidth = 1.2f;
meshPrototype.minHeight = 0.8f;
meshPrototype.maxHeight = 1.2f;
meshPrototype.healthyColor = Color.white;
meshPrototype.dryColor = Color.gray;
// 设置细节对象
terrainData.detailPrototypes = new DetailPrototype[] { grassPrototype, meshPrototype };
terrainData.RefreshPrototypes();
}
}
在这个示例中,grassTexture
是你要添加的草地纹理,detailMesh
是你要添加的细节网格(例如花朵)。脚本会在地形上添加这些细节对象,并设置它们的参数。