从零开始入门创作游戏——2D沙盘类随机地图的生成

这篇具有很好参考价值的文章主要介绍了从零开始入门创作游戏——2D沙盘类随机地图的生成。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

如果想做类似于泰拉瑞亚的沙盘游戏,首先需要生成随机的地图。


  • 定义世界大小

首先需要确定地图大小和砖块元素

1、地图所需基本参数

因为只有第一次开始时会生成地图,所以可以删除update函数

public class Sandbox_seed : MonoBehaviour
{
    public int worldwidth = 100;    // 地图宽度
    public int worldheight = 50;    // 地图高度

    void Start()
    {

    }
}

2、砖块元素

为了简单,直接创建方块元素来代替游戏砖块。在资源栏右键创建即可。默认白色方便进行观察。

游戏地图生成,Unity,游戏,unity

生成方块后,为了保证其边缘对齐unity页面的网格,所以修改其原点到左下角,使得左下角第一个方块的左下角对准unity原点。

进入sprite编辑页,修改右下角的数值,x=0,y=0,修改完后保存游戏地图生成,Unity,游戏,unity

  • 使用函数生成地图噪声值

我所使用的是 Unity 中的 Mathf.PerlinNoise 函数来生成一个二维噪声值。

而该函数中需要增加部分参数。

其中为了保证地图随机,添加参数【seed】来创建随机数,即地图种子。使用相同的地图种子可以生成相同的世界地图。

public class Sandbox_seed : MonoBehaviour
{
    public int worldwidth = 200;          // 地图宽度
    public int worldheight = 50;          // 地图高度

    public int groundHeight = 25;         //地表高度
    public float surfaceFreq = 0.05f;     //地表的平滑度,越大越不平滑
    public float surfaceMultiper = 20f;   //地表的高低差,越大越陡峭

    public int seed = 0;                 //地图种子,可以使用随机数

    void Start()
    {

    }
}

使用PerlinNoise的代码如下:

public class Sandbox_seed : MonoBehaviour
{

    /*各种参数*/

    void Start()
    {
        GenerateTexture();
    }

    public void GenerateTexture()
    {
        for (int x = 0; x < worldwidth; x++)     //x为地图宽度,因为第一格为0,所以最后一格为199
        {
            float surfaceNoise = Mathf.PerlinNoise((x + seed) * surfaceFreq, seed * surfaceFreq) * surfaceMultiper + groundHeight;
        }
    }

关于Mathf.PerlinNoise函数,是以给定的2个参数为坐标,返回一个取值范围为0到1的浮点型,而且返回值比较连续且光滑。

而在这里的x的for循环中,函数内第一个参数【(x + seed) * surfaceFreq】递增而第二个函数【seed * surfaceFreq】不变,实际上生成的噪声图将呈现出水平连续的波纹状。

但由于结果是0到1的浮点型,因此需要增加其振幅,即参数【surfaceMultiper】,代表地表的高低差,数值越大越陡峭。

而为了让地图向上偏移,需要添加参数【groundHeight】,代表地表高度。

而Mathf.PerlinNoise函数内的额外参数【surfaceFreq】,是为了增加输出数值的噪声值,该值代表地表的平滑度,越大越不平滑

这个函数的实际表现可以结合下面生成砖块后的图像进行理解。

游戏地图生成,Unity,游戏,unity

  • 使用噪音值生成地图砖块

以x为横坐标,以上面函数最终输出的值surfaceNoise为纵坐标生成地图。y的取值范围小于surfaceNoise即保证该线的下方会被方块填充。

注意添加参数tile,然后将砖块元素拖动到对应的位置让脚本引用。

public class Sandbox_seed : MonoBehaviour
{

    /*各种参数*/
    
    public Sprite tile; //砖块元素

    void Start()
    {
        seed = Random.Range(10000, 20000);

        GenerateTexture();
    }

    public void GenerateTexture()
    {
        for (int x = 0; x < worldwidth; x++)     //x为地图宽度,因为第一格为0,所以最后一格为199
        {

            float surfaceNoise = Mathf.PerlinNoise((x + seed) * surfaceFreq, seed * surfaceFreq) * surfaceMultiper + groundHeight;
            for (int y = 0; y <= surfaceNoise; y++)
            {
                GameObject newTile = new GameObject(name = "tile");
                newTile.transform.parent = this.transform;
                newTile.AddComponent<SpriteRenderer>();
                newTile.GetComponent<SpriteRenderer>().sprite = tile;
                newTile.transform.position = new Vector2(x, y);
            }
        }
    }

要使脚本运行起来,需要在unity场景中创建一个空对象,然后将脚本拖到该对象中。并且在脚本中的public sprite的位置(红框,平铺为翻译错误)添加创建的方形元素。

游戏地图生成,Unity,游戏,unity

启动游戏后即生成随机地貌

seed = 0

游戏地图生成,Unity,游戏,unity

 seed = 12304

游戏地图生成,Unity,游戏,unity

seed = 16068

游戏地图生成,Unity,游戏,unity

  • 创建洞窟的噪音和砖块

洞窟与地表一样使用 Mathf.PerlinNoise 函数来生成,但不一样的是,需要使用 x 轴和 y 轴来生成地图。

首先需要生成一张世界地图所需要的噪音图,然后使用该图来进行参照,来填充(掏空)地图砖块。代码如下

public class Sandbox_seed : MonoBehaviour
{

    /*各种参数*/

    public Texture2D noiseTexture;    //创建一个材质,然后通过代码生成噪音二位图

    public void GenerateNoiseTexture()
    {
        noiseTexture = new Texture2D(worldwidth, worldheight);

        for (int x = 0; x < noiseTexture.width; x++)
        {
            for (int y = 0; y < noiseTexture.height; y++)
            {
                float v = Mathf.PerlinNoise((x + seed)*0.05f , (y + seed ) * 0.05f);
                noiseTexture.SetPixel(x, y, new Color(v, v, v)); 
                //1、SetPixel函数根据像素位置,生成对应x,y坐标下的像素颜色为Color(v, v, v)的点
                //2、Color函数的参数如果是浮点型,取值范围为(0到1)时,0为黑,1为白,可以在画板查看对应色阶的RGB
            }
        }
        noiseTexture.Apply();  //将上面点生成对应的二位噪音图保存
    }
}

启动程序后可以点开材质选项,查看生成的图

游戏地图生成,Unity,游戏,unity

游戏地图生成,Unity,游戏,unity

然后根据生成的噪音图生成洞穴

public class Sandbox_seed : MonoBehaviour
{

    /*各种参数*/

    public float caveFreq = 0.25f;        //山洞参数,数值越大洞越多和大

    void Start()
    {
        seed = Random.Range(10000, 20000);

        GenerateNoiseTexture();
        GenerateTexture();
    }

    public void GenerateNoiseTexture(){ ... }

    public void GenerateTexture()
    {
        for (int x = 0; x < worldwidth; x++)      //x为地图宽度,因为第一格为0,所以最后一格为199
        {

            float surfaceNoise = Mathf.PerlinNoise((x + seed) * surfaceFreq, seed * surfaceFreq) * surfaceMultiper + groundHeight;

            for (int y = 0; y <= surfaceNoise; y++)
            {
                if (noiseTexture.GetPixel(x, y).r > caveFreq)    
                //GetPixel(x, y).r 是指该像素位置的RGB值中的R值,使用b和g都可以
                //如果该像素所在位置的颜色比洞窟参数的颜色深(白)的话,就生成该砖块,否则留空为洞穴
                {
                    GameObject newTile = new GameObject(name = "tile");
                    newTile.transform.parent = this.transform;
                    newTile.AddComponent<SpriteRenderer>();
                    newTile.GetComponent<SpriteRenderer>().sprite = tile;
                    newTile.transform.position = new Vector2(x, y);
                }

            }
        }
    }
}

最终生成的像素图如下

游戏地图生成,Unity,游戏,unity

而对应的世界地图如下​​​,可以看出,像素噪音图中黑色的地方为空洞,而白色的地方为砖块

游戏地图生成,Unity,游戏,unity文章来源地址https://www.toymoban.com/news/detail-743279.html

到了这里,关于从零开始入门创作游戏——2D沙盘类随机地图的生成的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • unity2d实现一个全方位的无限随机地图

    要实现一个全方位的无限随机地图,可以考虑以下步骤: 1.创建一个空的场景,并添加一个相机和一个玩家对象。 2.创建一个TileMap,它将作为你的地图板块。你可以使用随机数生成算法生成各种类型的地形,如森林、草地、沙漠等等,并使用TileMap将它们组装在一起来创建你

    2024年02月07日
    浏览(44)
  • 【unity实战】随机地下城生成4——小地图的制作(2d,3d通用)(含源码)

    参考原视频链接: 【视频】:https://space.bilibili.com/370283072 注意 :本文为学习笔记记录,推荐支持原作者,去看原视频自己手敲代码理解更加深入 新建一个摄像机,用来查看小地图,我们分个图层只能新建的摄像机才可以拍摄到 如果对摄像机和渲染纹理还不理解的,强烈推

    2023年04月21日
    浏览(49)
  • 【unity实战】Unity2D TileMap+柏林噪声生成随机地图(附源码)

    我的上一篇文章介绍了TileMap的使用,主要是为我这篇做一个铺垫,看过上一篇文章的人,应该已经很好的理解TileMap的使用了,这里我就不需要过多的解释一些繁琐而基础的知识了,省去很多时间。所有没看过上一篇文章的小伙伴我强烈建议先去看看:

    2024年02月03日
    浏览(48)
  • 【unity小技巧】Unity2D TileMap+柏林噪声生成随机地图(附源码)

    我的上一篇文章介绍了TileMap的使用,主要是为我这篇做一个铺垫,看过上一篇文章的人,应该已经很好的理解TileMap的使用了,这里我就不需要过多的解释一些繁琐而基础的知识了,省去很多时间。所有没看过上一篇文章的小伙伴我强烈建议先去看看:

    2024年02月07日
    浏览(35)
  • 教你从零开始画echarts地图

    离线地图下载地址https://datav.aliyun.com/tools/atlas/index.html echarts文档地址https://echarts.apache.org/zh/option.html 基于VUE编写,其他框架请自行转换,大同小异 先让地图内容出来,npm安装步骤省略,请参考官方文档,创建的div必须设置宽度和高度,关于图表的宽高自适应,参考我的另一

    2023年04月17日
    浏览(77)
  • Unity2D绘制游戏地图

    首先,我们选择我们的地图素材(由于笔者在前段时间已经进行切割,最近才开始整理这一段,所以这个是用的老素材,可能有朋友就会觉得切割前后不一致,但是思路是一样的,大家学习思路即可)  接着,我们找到右上角的Slice进行图片切割,我这边简单介绍一下这个切

    2024年02月08日
    浏览(49)
  • [JavaScript游戏开发] 2D二维地图绘制、人物移动、障碍检测

    第一章 2D二维地图绘制、人物移动、障碍检测 第二章 跟随人物二维动态地图绘制、自动寻径、小地图显示(人物红点显示) 第三章 绘制冰宫宝藏地图、人物鼠标点击移动、障碍检测 第四章 绘制Q版地图、键盘上下左右地图场景切换 复习JavaScript 事件有感,心血来潮想做一个

    2024年02月16日
    浏览(43)
  • 游戏开发小结——如何在Unity中创建有边界的2D地图

    在创建地图时,我们希望将玩家限制在边界内。但是,让世界实际上在自身上包裹也很好:这可以为游戏机制提供有趣的元素,同时也给玩家一种增加自由度的印象。 在本文中,我们将向您展示如何为2D游戏实现这种行为的简单方法。 在N乘以M网格地图中限制玩家位置 在大多

    2024年02月04日
    浏览(38)
  • 19. Unity - 2D游戏开发小记02 --- 伪透视图、2D物体碰撞、瓦片地图碰撞、素材缩放平铺

    1. 伪视图 在2D游戏开发当中,当角色移动时,会发生物体与物体之间的前后遮挡。2D视图中的前后关系是由 Y 轴决定,y 值越小物体越靠前。unity的渲染应开启根据 y 值的大小进行渲染才能保证正确的遮挡效果,在菜单栏 Editor–project setting -- Graphic 中按照下图方式进行设置:

    2024年02月02日
    浏览(94)
  • 从零开始学习调用百度地图网页API:二、初始化地图,鼠标交互创建信息窗口

    注 :需要将 你的ak 替换,从百度地图官网注册申请。 脚本中使用BMap创建Map实例,centerAndZoom()初始化地图设置中心点为北京,地图等级15。enableScrollWheelZoom()鼠标滚轮可缩放窗口。addEventListener监听鼠标点击事件,发生后,传递事件e至function(e),执行openInfoWindow,在鼠标点击坐

    2024年02月07日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包