地形与风景
Assets/
Scenes/
Scripts/
Prefabs/
Materials/
all your scripts
你已经有的这一课新增
Arena.unity 仍然只是一个装着你角色的灰盒子。这个 tab 是在它周围搭出世界 —— 围着你已有的竞技场来建,而不是取代它。
- 1
打开 Assets/Scenes/Arena.unity —— 就是你从 tab 01 一直用下来的那个文件。不要新建场景:地板、方块、角色、敌人和相机装置全都留着。
- 2
动手之前先按 Play。Knight 应该走路、跳跃、放技能,和 tab 03 结束时一模一样。
- 3
什么都不要重建。如果按 Play 还不能四处走动,那在你堆第一座小丘之前先修好它。
Terrain 是一个由 heightmap 驱动的单一优化 mesh。你不用手工建模山丘,而是用笔刷画高度。
笔刷把 heightmap 抬起来,底下的 mesh 跟着变形。
创建地形
- 1
。坐标原点会出现一块 1000×1000 m 的平板。
- 2
对单个竞技场来说这太大了。在 Terrain Settings 齿轮里把 Terrain Width 和 Length 设为 200。
- 3
Heightmap Resolution 设 513,Detail Resolution 设 512 —— 小关卡足够了,而且轻得多。
- 4
把地形移到 -100, -0.05, -100。它的中心正好落在竞技场下方,表面比 tab 01 的地板低一点点,所以两个面永远不会互相闪烁。
工具栏里的五个工具
Raise or Lower Terrain —— 左键抬高,Shift + 左键压低。先用又大又软、强度很低的笔刷开始。
Set Height —— 点击就把范围内一切压成精确高度。能盖东西的台地就是这么来的。
Smooth Height —— 抹掉笔刷留下的锯齿噪声。你会一直用到它。
Paint Texture —— 地面材质的图层:草地、岩石、沙地、小路。
Paint Trees 和 Paint Details —— 树是 Prefab,细节是草的 billboard。
绘制图层
- 1
Paint Texture → Edit Terrain Layers → Create Layer。第一个图层覆盖整个地形。
- 2
每个图层的 Tiling Size 设为 8–15 米。默认的 2 会让重复花纹一眼看穿。
- 3
加一个岩石图层,只画在陡坡上;再用小而硬的笔刷加一条小路图层。
- 4
在移动端最多四个图层。每多一个图层,每个像素就多一次 texture 采样。
树、草和风
用 Terrain 工具种的树,远处会自动变成 billboard —— 比手工摆 Prefab 便宜得多。
在 Terrain Settings 里把 Tree Distance 设为约 120,Billboard Start 约 60。
草是 Detail Mesh 或 Grass texture。Detail Distance 在桌面端 40,移动端 20 或更低。
Wind Zone(GameObject > 3D Object > Wind Zone)让树和草摇摆。整个关卡一个就够。
用代码读取地形高度
using UnityEngine;
public class TerrainPlacer : MonoBehaviour
{
[SerializeField] private GameObject prefab;
[SerializeField] private int count = 60;
[SerializeField] private float area = 90f;
void Start()
{
Terrain terrain = Terrain.activeTerrain;
for (int i = 0; i < count; i++)
{
float x = Random.Range(-area, area);
float z = Random.Range(-area, area);
// exact ground height at that world position
float y = terrain.SampleHeight(new Vector3(x, 0f, z)) + terrain.transform.position.y;
Quaternion rot = Quaternion.Euler(0f, Random.Range(0f, 360f), 0f);
Instantiate(prefab, new Vector3(x, y, z), rot, transform);
}
}
}