最近翻起以前下载的一些老的教学视频,于是决定重新看一遍,且每周所学做个记录,下面就直接开始。

这篇文章就讲讲教程里面的随机2D地图的实现原理,以及代码展示。

首先效果如下:

右边是使用UntiyEditor所编辑的一个生成面板。左边是实际所生成的地图。

下面是实际源码展示


 public void CreateTiles(){var total = tiles.Length;for (int i = 0; i < total; i++){var tile = new Tile_();tile.id = i;tiles[i] = tile;}FindNeighbors();}private void FindNeighbors(){for (int r = 0; r < rows; r++){for (int c = 0; c < columns; c++){var tile = tiles[columns*r+c];if (r<rows-1){tile.AddNeighbor(Sides.Bottom,tiles[columns*(r+1)+c]);}if (c<columns-1){  tile.AddNeighbor(Sides.Right,tiles[columns*r+c+1]);}if (c>0){tile.AddNeighbor(Sides.Left,tiles[columns*r+c-1]);}if (r>0){tile.AddNeighbor(Sides.Top,tiles[columns*(r-1)+c]);}}}}

首先要想实现2D地图,最简单的就是先能按照自己所设定的尺寸生成一个矩形的地图,且每一个单位是由一张sprite组成,这个应该不难。然后,按照面向对象的思维,每一个sprite身上都有一个tile的脚本,用来记录自身的信息,以及他周围的邻居,以上代码就是简单的生成了tile,然后下面对他上下左右的tile都进行了储存。

接下来就是如何把这个地图包围起来,始现效果如下

首先大家的疑问都是这个地图是如何知道,他的边缘应该是如何进行填充的。这个时候就是用到了一个很简单的知识点,二进制。

 private void CalculateAutotileID(){var sideValues = new StringBuilder();foreach (Tile_ tile in neighbors){sideValues.Append(tile == null ? "0":"1");}autotileID = Convert.ToInt32(sideValues.ToString(),2);}

在生成完地图的每个Tile以及记录了他们的邻居时候,根据他们邻居有或者没,用0和1来表示。那么就可以遍历出所有的情况,比如这个tile如果他周围都是空的只有他自己,那么他上下左右都是0,换成二进制就是 0,0,0,0,如果他周围都有方块,那么换成二进制就是1,1,1,1。这就是两种极端的情况。以此类推,我们根据每个tile储存的他自己周围的邻居,就可以得到每个tile当前处于什么状态,然后转换为10进制的数字,这就是上文的autotileID,并储存在他们每个tile自身的类身上,然后只要在合适的时机。根据这个ID加载对应的sprite,就能实现一个最简单的四四方方的地图。


接下来我们讲讲,当我们生成了一个矩型的地图之后我们如何让他周围被腐蚀掉,从而实现如下图的效果

 public void CreateIsland(float erodePrecent,int erodeIterations,float treePercent,float hillPercent,float mountainPercent,float townsPercent,float monsterPercent,float lakePercent){   DecorateTiles(landTiles,lakePercent,TileType.Empty);for (int i = 0; i < erodeIterations; i++){DecorateTiles(coastTiles,erodePrecent,TileType.Empty);}var openTiles = landTiles;RandomizeTileArray(openTiles);if (openTiles!= null && openTiles[0] != null){openTiles[0].autotileID = (int)TileType.Castle;}DecorateTiles(landTiles,treePercent,TileType.Tree);DecorateTiles(landTiles,hillPercent,TileType.Hills);DecorateTiles(landTiles,mountainPercent,TileType.Mountain);DecorateTiles(landTiles,townsPercent,TileType.Towns);DecorateTiles(landTiles,monsterPercent,TileType.Monster);}public void DecorateTiles(Tile_[] tiles,float percent,TileType type){ var total = Mathf.FloorToInt(tiles.Length*percent);RandomizeTileArray(tiles);for (int i = 0; i < total; i++){    var tile = tiles[i];if(type == TileType.Empty){tile.ClearNeighbors();}tile.autotileID = (int)type;}}

上面的代码,创建了一个简单的方法,DecorateTiles,传入指定的tile数组,然后根据百分比,把他们换成制定的tile类型。

腐蚀的方法很简单,就在第一个方法的for循环里面,他是找到了所有autotileID小于15的方块,小于15就代表了他们都是边缘tile,然后对他们随机进行置空,然后根据unityEditor所填下的值。决定执行几次置空循环。

里面的其他代码也很容易理解,就是获取了数值为15的autotileID的方块,数值为15就是都为里面填充的方块,只要根据百分比转换成你需要的树,山,之类的,就能实现上图最简单的效果。

总结一下,这个简单的2D随机地图,就是通过二进制获得了所有地图的关系信息,用这个关系信息进行数据的处理,填充,置空。来实现出如上图的效果。

Unity 2D随机地图相关推荐

  1. [Unity]Roguelike随机地图生成(一)

    初步随机地图生成 基础房间生成 房间门的判断 基础房间生成 首先需要确定每次房间生成都是在上一个房间的哪个方向上生成,为此需要声明一个枚举值来记录上下左右四个方向 创建脚本RoomGenerator, ...

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

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

  3. unity柏林噪声生成2d随机地图

    1.说下思路.柏林噪声需要两个小于1的的参数导入.然后柏林噪声会输出一个相对波动变化的值0到1之间,如果对这个值进行的区间判断,就可以决定生成地图数量.比如,if<0.6再生成地图块, 2.对传 ...

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

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

  5. Unity使用波函数坍缩 (Wave Collapse Function)算法生成随机地图

    在游戏领域和人工智能领域有一个随机生成地图用的比较多的算法叫做波函数坍缩 (Wave Collapse Function)算法,这个算法可以根据自己定制的规则生成随机地图. 根据波函数坍缩算法的源码 ...

  6. Unity中利用柏林噪音生成随机地图

    利用柏林噪音生成随机地图<2/2/2018> 什么是柏林噪音?(请自行百度)Perlin噪声 ( Perlin noise )指由Ken Perlin发明的自然噪声生成算法 . 原理学习可 ...

  7. unity c#《自己做游戏》之 设计一个可以生成复杂解密地图的随机地图系统 第一篇 设计地图规划,每日更新!!!

    随机地图,或是随机地牢,有很多实现方式.目前比较流行的方法是使用随机房间+剖分三角形加 prime算法生成. 还有一种方式就是反解有权图.个人认为反接有权图布局逻辑更可控一些. 需求 随机生成地图,且 ...

  8. 这些坑别踩!游戏随机地图生成开发经验分享

    当时虽然简单实现了目的,但后来自己也感到世界地图的呈现并不十分完美,恐怕也就只值95分.为了精益求精且给自己找点事做,便想对大地图的呈现方式做些微调. 之前略有瑕疵的世界地图 为何选择2D? 素材好找 ...

  9. Unity 2D打造《盖伦快跑》横版跑酷ARPG

    是一个灵活且高性能的开发平台,用于制作富有创意的3D和2D智能互动游戏.以其"一次创作,多平台部署"的性能使开发者们能够将内容发布到所有最热门的平台. 随着3D游戏市场的高速发展, ...

最新文章

  1. 4.3.6 无分类编址CIDR
  2. yml语法规则 (5.spring boot配置文件注入@ConfigurationProperties)、配置文件处理器...
  3. android 源码各版本下载 原生纯净版
  4. java按行写入txt文件内容_JAVA编程:读文件,按行输出文件内容
  5. dice系数什么意思_轮胎上的数字和字母是什么意思 轮胎上的红点黄点是什么意思...
  6. python观察日志(part23)--更改图片尺寸并保存
  7. ps画布扩展颜色灰色不可用的原因和解决方法
  8. composer 更新php位置,使用composer安装/更新PHP包
  9. vs2017安装qt
  10. 推荐一个学习内核的博客
  11. linux firefox 解雇ie,Fire IE
  12. IT计算机实习:JAVA实习报告范文(二)
  13. 一、linux驱动实验-14.1-imx6ull驱动MT7601
  14. Revit API之获取复合结构和材质
  15. Cplusplus实现的爱心代码,爱心里面有三个字李欣怡
  16. 写一个音乐播放器的微信小程序
  17. react 返回上一页
  18. AddressableAsset源码学习:组成与工作原理
  19. 计算机xp系统怎么录音,XP系统电脑怎么录音? - KK录像机
  20. 钟表时钟时间管理PPT模板

热门文章

  1. [音乐]新东西原声合唱团 - 《翠鸟》
  2. 苹果xsmax是什么接口_媲美苹果官方同款液态硅胶手机壳,拿手里太舒服了~
  3. 5、电子邮件客户端程序设计与实现
  4. Java开发快递物流项目(6)
  5. 字节流和字符流到底怎么用
  6. 【笨嘴拙舌WINDOWS】GDI(1)
  7. 信号频域特征提取 Matlab
  8. Java8 Optional剖析
  9. echarts如何在y旁边自定义分类色块代替y轴
  10. 用友t3服务器系统管理显示类型不匹配,存货核算进入时提示“类型不匹配”