[饥荒独立游戏制作] 3.仿我的世界地形

本文介绍如何在Unity中使用脚本自动生成地形。包括创建地形预制体、使用柏林噪声算法生成地形高度、根据高度分配不同材质等步骤。

准备工作

创建Cube,添加Icon,场景中新建MapGenerator空物体,挂载MapGenerator脚本,建立白、绿、蓝三个材质球。
public int mapHeight; public int mapWidth; public float lacunarity = 0.001f; public GameObject tilePrefab; public Material[] materials;
为MapGenerator提供生成按钮,通过编辑器拓展方式实现(用Odin更方便)。
[CustomEditor(typeof(MapGenerator))] public class MapGenerator_Editor : Editor { public override void OnInspectorGUI() { base.OnInspectorGUI(); if (GUILayout.Button("生成")) { ((MapGenerator)target).GenerateMap(); } } }

生成地图

public void GenerateMap() { //清理地图 for (int i = transform.childCount ; i > 0; i--) { DestroyImmediate(transform.GetChild(i - 1).gameObject);//支持Editor } //生成地图 for (int x = 0; x < mapWidth; x++) { for (int z = 0; z < mapHeight; z++) { float y = Mathf.PerlinNoise(x * lacunarity, z * lacunarity) * tileHeightMultiply; if (!isSmooth) { y = Mathf.Round(y); } Vector3 pos = new Vector3(x, y, z); GameObject go = Instantiate(tilePrefab,transform); go.transform.position = pos; go.name = y.ToString(); if (y > 0.7f * tileHeightMultiply) { go.GetComponent<MeshRenderer>().material = materials[0]; } else if(y > 0.3f * tileHeightMultiply) { go.GetComponent<MeshRenderer>().material = materials[1]; } else { go.GetComponent<MeshRenderer>().material = materials[2]; } } } }
首先倒序清理地图(正序删除数组长度在变化,会产生错误),生成地图时,y轴高度使用柏林噪声算法平滑生成随机数,并为不同高度的Cube赋予不同颜色的材质做区分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值