绘制地形和小地图

本文介绍了在Unity中利用PerlinNoise生成地形并创建小地图的方法,比较了直接创建相机和截图截取的优缺点,重点讲解了如何通过顶点辅助和颜色区分地形高低,以及如何在性能上进行优化以提高游戏体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.地形和小地图的用途

地形:像熟知的原神,就带有地形;

小地图:热门游戏王者荣耀也用到了小地图。

接下来了解地形和小地图的代码逻辑:

小地图的操作流程:

第一种方法是可以直接在场景中创建一个相机,优点是操作确实简单,但是对性能的消耗非常大,会导致游戏卡顿,影响玩家游戏体验;

第二种方法就是,截图,把地图截下来赋值到Image上面,按照比例计算人物位置,但是这样的精准度极低;

我们可以直接把地形的材质赋值给小地图,这样就能实现小地图效果。

地形的流程:

地形的实现也比较简单,只需要有形状,有起伏即可,所以,我们使用渲染图形的顶点辅助方法来绘制地形。

如果所需要绘制的地形需要带有颜色,可以用不同颜色来区分地形高低。

代码逻辑和绘制图形的代码类似,加入不同的颜色来区分地形的高低,加入玩家预制体显示在小地图,还是需要顶点坐标来确认地形的大小

public Color color1=Color.blue;
    public Color color2=Color.green;
    public int width = 200;
    public int height = 200;
    public Texture2D texture2D;
    public Image map;
    public Image playerPos;
    public GameObject player;
脚本变量初始化
 texture2D = new Texture2D(width, height);
        VertexHelper vh = new VertexHelper();
        for (int i = 0; i < width; i++)
        {
            for (int j = 0; j < height; j++)
            {
                float y = Mathf.PerlinNoise(i * 0.1f, j * 0.1f);
                texture2D.SetPixel(i, j, Color.Lerp(color1, color2, y));
                float uvx = (float)i / (float)width;
                float uvy = (float)j / (float)height;
                vh.AddVert(new Vector3(i - width / 2, y * 3, j - height / 2), Color.white, new Vector2(uvx, uvy));
                if (i<width-1&&j<height-1)
                {
                    vh.AddTriangle(i * height + j, i * height + j + 1, (i + 1) * height + j + 1);
                    vh.AddTriangle(i * height + j, (i + 1) * height + j + 1, (i + 1) * height + j);
                }
            }
        }
        texture2D.Apply();
        Mesh mesh = new Mesh();
        vh.FillMesh(mesh);
        GetComponent<MeshFilter>().mesh = mesh;
        GetComponent<MeshCollider>().sharedMesh = mesh;
        GetComponent<MeshRenderer>().material.mainTexture = texture2D;

        Material material = new Material(Shader.Find("UI/Default"));
        material.mainTexture = texture2D;
        map.material = material;
        player = GameObject.FindGameObjectWithTag("Player").gameObject;

因为地形和小地图涉及到了长宽,所以使用双重循环来代表长宽 

绘制顶点坐标和渲染器进行位置坐标和上色的处理

最后实例一个玩家到地图中

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值