本篇文章教我们用柏林噪声法生成一块地图,并生成对应地形的小地图
1.效果图
对象可根据效果图对应创建
2.创建一个空对象,空对象上挂载脚本,子对象是个Quad对象充当水面 位置+旋转角度+尺寸自行根据生成的地图大小来设置
3.代码实现
此代码脚本挂载在创建的空对象即可
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
[RequireComponent(typeof(MeshRenderer), typeof(MeshCollider), typeof(MeshFilter))] //首先添加需要的组件
public class PerlinNoiseMesh6 : MonoBehaviour
{
[SerializeField]
Texture2D map_tex; //地图图片
int w, h; //地图图片宽高
Mesh mesh;
VertexHelper vh; //顶点帮助类
float height_P = 10; //柏林噪声控制高低起伏
public Image map_img; //小地图img (UI)
Texture2D map_c; //用于(创建)当小地图img的精灵图
// Start is called before the first frame update
void Start()
{
w = map_tex.width; h = map_tex.height; //获取地图图片的宽和高
mesh = new Mesh();
vh = new VertexHelper();
map_c = new Texture2D(w, h); // 注意w,h
for (int x = 0; x <= w; x++)
{
for (global::System.Int32 z = 0; z <= h; z++)
{
float y = Mathf.PerlinNoise(x * 0.04f, z * 0.04f); //注意此是一块地图
vh.AddVert(new Vector3(x, y * height_P, z), Color.white, new Vector2(0.5f, 0.5f)); //添加顶点坐标
if (x < w && z < h) //添加三角形索引
{
vh.AddTriangle(x * (h + 1) + z, x * (h + 1) + z + 1, (x + 1) * (h + 1) + z + 1);
vh.AddTriangle(x * (h + 1) + z, (x + 1) * (h + 1) + z + 1, (x + 1) * (h + 1) + z);
}
}
}
vh.FillMesh(mesh); //绘制
GetComponent<MeshFilter>().mesh = mesh; //赋
Material mat = new Material(Shader.Find("Standard")); //普通材质球
mat.mainTexture = map_tex; //赋主图片
GetComponent<MeshRenderer>().material = mat;
GetComponent<MeshCollider>().sharedMesh = mesh; //
Vector3[] vectors = mesh.vertices; //获取mesh的顶点位置
Color waterColor = new Color(0, 0.8649864f, 1, 1); //水的颜色
for (int x = 0; x < w; x++) //注意这里不用<=
{
for (global::System.Int32 z = 0; z < h; z++)
{
float y = vectors[x * (h + 1) + z].y; //获取顶点位置的y值
//判断高度
if (y <= 2.85f) //水面的高度可自定义
{
map_c.SetPixel(x, z, waterColor); //小地图上的水
}
else
{
map_c.SetPixel(x, z, map_tex.GetPixel(x, z)); //小地图
}
}
}
map_c.Apply(); //将图片应用一下
map_img.sprite = Sprite.Create(map_c, new Rect(0, 0, w, h), new Vector2(0.5f, 0.5f)); //创建小地图的精灵图并赋值
}
}
4.注意
//判断高度
if (y <= 2.85f) //水面的高度可自定义
注意着里的2.85是根据你水面的高度来计算的
然后记得别忘记给水面对象赋上设置蓝色的材质球
还有拖拽资源
小菜不易,感谢观看,学到了就留下个支持的赞吧!
关注我,了解更多Unity相关知识哦!