柏林噪声生成地图、水面、小地图生成、小地图映射水面、Mesh

本篇文章教我们用柏林噪声法生成一块地图,并生成对应地形的小地图

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相关知识哦!

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
柏林噪声算法是一种用于生成2D地图的算法。它是由柏林数学家卡尔·维特所提出的。该算法的基本原理是通过一系列随机数生成器产生噪声,在二维空间中形成连续的噪声图案。 柏林噪声算法的过程可以简单概括为以下几个步骤: 1. 确定地图大小和分辨率:首先需要确定生成地图的大小和分辨率,即地图的宽度和高度,以及像素的数量。 2. 创建随机数生成器:使用随机数生成器产生随机数序列,这些随机数将用于生成噪声地图柏林噪声算法通常使用梅森旋转算法或其他类似的高质量随机数生成器。 3. 生成噪声图案:按照一定的规则和算法,使用随机数生成生成噪声图案。柏林噪声算法通常使用渐变产生随机数的方法,即每个点的随机数值是由其周围点的随机数值决定的,通过对这些值进行插值计算得到最终的噪声图案。 4. 进行后处理:得到的噪声图案可能会有一些不合理或不自然的地方,需要进行后处理来修正。常见的后处理方法包括平滑、调整亮度和对比度等。 5. 输出地图:最终生成2D地图可以输出为图片文件或其他形式的图形数据,供使用者进行进一步处理或应用。 柏林噪声算法生成2D地图具有丰富的细节和真实感,可以应用于游戏开发、地理信息系统等领域。它是一种有效而常用的生成地图的算法,被广泛应用于计算机图形学和计算机模拟领域。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我不食卷心菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值