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


  • 定义世界大小

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

1、地图所需基本参数

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

public class Sandbox_seed : MonoBehaviour
{public int worldwidth = 100;    // 地图宽度public int worldheight = 50;    // 地图高度void Start(){}
}

2、砖块元素

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

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

进入sprite编辑页,修改右下角的数值,x=0,y=0,修改完后保存

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

我所使用的是 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】,是为了增加输出数值的噪声值,该值代表地表的平滑度,越大越不平滑

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

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

以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的位置(红框,平铺为翻译错误)添加创建的方形元素。

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

seed = 0

seed = 12304

seed = 16068

  • 创建洞窟的噪音和砖块

洞窟与地表一样使用 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();  //将上面点生成对应的二位噪音图保存}
}

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

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

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);}}}}
}

最终生成的像素图如下

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

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

  1. 从零开始入门创作游戏——对象交互与UI展示

    做教程远比自己开发游戏要花时间...继续写小恐龙的游戏教程 环境搭建在这里 从零开始入门创作游戏--Unity3d的环境搭建_默哀d的博客-CSDN博客 素材导入和基本页面介绍在这里 从零开始入门创作 ...

  2. 从零开始入门创作游戏——游戏对象的脚本编辑

    做教程远比自己开发游戏要花时间...继续写小恐龙的游戏教程 环境搭建在这里 从零开始入门创作游戏--Unity3d的环境搭建_默哀d的博客-CSDN博客 素材导入和基本页面介绍在这里 从零开始入门创作 ...

  3. 从零开始入门创作游戏——Unity3d的环境搭建

    最近自己被裁了,闲着没事就跟朋友讨论说试一试做一下游戏(每个男人心里都有过的幻想),就此记录一下自己从零基础开始做第一个超简单的游戏. 入门的门,搭建环境 这就是我入门第一个坑. 首先进入下面的官网 ...

  4. 【游戏设计图形学】在地图上生成蜿蜒河流的两种方法

    引言 在开发游戏时,我们经常需要用到随机生成的地形,而河流是其中不可或缺的一部分.本文章将探讨如何在地图上生成河流. 河流生成的自然原因 高山积雪,地下水,雨水是河流发源的主要原因,而由于雨水形成的小 ...

  5. 游戏中随机地图的实现

    游戏中随机地图的实现 很多游戏都用到了随机地图,比如矮人要塞,CDDA,MineCraft,RimWorld. 随机地图带给游戏更多的趣味性,每一次新建游戏都有不同的体验. 一般游戏中生成随机地形都是 ...

  6. 2D随机地图算法整理

    在做cs61b project2 中涉及到2维随机地图的生成,查询资料过程中找到以下几种算法,在此记录一下. Dungeon-Building Algorithm 参考link: http://www ...

  7. 类似元气骑士的九宫格随机地图实现

    类似元气骑士的九宫格随机地图实现 主要思路 代码部分 效果演示 补充 参考 主要思路 情况1.九宫格中随机选择7个方格出来必定可联通(可斜向联通). 情况2.九宫格中随机选择7个方格出来大部分情况可联 ...

  8. Unity—2D跑酷类游戏(一)

    实现思路 2D跑酷类游戏是模拟3D场景的效果的一个过程,主要就是怎么样通过一些2D图片来呈现3D游戏的效果.在这里我主要总结了三点. 在3D场景中随着障碍物的移动,其相应的坐标和大小也会发生变化. 让 ...

  9. 2D平台类游戏开发教程(翻译)

    这是一篇实现2D平台类游戏的技术指导文章,原文地址:http://higherorderfun.com/blog/2012/05/20/the-guide-to-implementing-2d-pla ...

最新文章

  1. B - 娜娜梦游仙境系列——跳远女王
  2. 网络服务之DNS基本应用
  3. Linux系统编程之查看文件大小的方法(lseek and stat)
  4. 训练softmax分类器实例_知识蒸馏:如何用一个神经网络训练另一个神经网络
  5. AndroidStudio修改默认C盘配置文件夹(.android.gradle.AndroidStudio)以及修改后避免踩的坑
  6. pytorch中的pre-train函数模型引用及修改(增减网络层,修改某层参数等)
  7. 如何使用参数调用SAP UI5的bingAggregation
  8. VS Code的golang开发配置 之 代码提示
  9. python语句结束符_python中判断文件结束符的具体方法
  10. c语言switch scanf语句,c语言switch语句 谢谢·!~!~
  11. Vue+elementUI+springboot+mybatis demo教程(二)
  12. 富文本转换字符串 php,php 如何将一个富文本字符串生成word文档?
  13. AlphaBlend 详解
  14. python柱状图颜色_Python 绘制 柱状图
  15. 调用Gmaps根据地址显示对应的Google地图(对控件进行隐藏和改变)
  16. 我最喜欢的计算机课英语作文,我最喜欢的课外活动英语作文(通用10篇)
  17. flashback的配置
  18. 关于kindeditor编辑器批量上传图片不显示添加图片按钮的问题
  19. DNS劫持,HTTP劫持、HTTPS劫持【流量劫持】
  20. 12个最真实的人型机器人,肉眼几乎无法区分,你见过几个?【楚才国科】

热门文章

  1. 错误:‘CV_RETR_EXTERNAL’在此作用域中尚未声明
  2. C语言中的void 和void 指针类型
  3. 2022/7/17/题解2022河南萌新联赛第(二)场:河南理工大学https://ac.nowcoder.com/acm/contest/37344
  4. css/html 定位 绝对定位/相对定位
  5. 使用Hyper-V的虚拟机搭建集群
  6. 中外对比:国内云计算平台的三大特点
  7. 太阳能板最大面积js
  8. python怎么多行输入_python如何输入多行
  9. 服务器的操作系统和数据库关系,数据库、数据库管理系统和SQL之间的关系
  10. 【MySQL】MyCat分库分表分片规则配置详解与实战(MySQL专栏启动)