Roguelike随机地下城 | 一、生成随机房间

2023-10-29 21:10

本文主要是介绍Roguelike随机地下城 | 一、生成随机房间,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Roguelike随机地下城

生成随机房间


文章目录

  • Roguelike随机地下城
  • 前言
  • 一、什么是随机地下城?
  • 二、生成随机房间
  • 总结


前言

上一个简单的UI框架基本完结,后续可能会有所更新,接下来我会更新我在学习的随机地下城,我会一边学习一边更新。


一、什么是随机地下城?

随机地下城就是我们Unity会通过我们的代码,自动的生成地下城的地图,并且里面的物品场景也会随机生成。

二、生成随机房间

首先我们先建一个Unity工程。
我们一开始先不着急使用地图场景资源,先定义随机生成房间的方法。
养成好习惯先建立两个空的文件夹,一个为Prefabs存放预制体,一个为Scripts存放脚本。
这里我建立了一个空的GameObject命名为BasicRoom,作为我们的房间,并生成预制体,因为我们后续要通过这个预制体随机生成房间。
在这里插入图片描述
我们再生成一个空的GameObject命名为RoomGenerator,用来暂时当我们的主场景,在上面生成我们的随机位置的BasicRoom
接下来我们在RoomGenerator下再创建一个GameObject命名为Point,用来判断我们每一个生成的房间的位置。
在这里插入图片描述
接下来我们就要开始编写我们的代码,再RoomGenerator下建立脚本。
首先我们定义一下我们的预制体,还有我们要生成的房间数,我们还设置一下开始房间和最后房间的颜色方便我们判断,获得我们每一个房间的位置的点,和x轴y轴的偏移量。

    [Header("房间信息")]public GameObject roomPrefab;public int rooNumber;public Color startColor,endColor;[Header("位置控制")]public Transform generatorPoint;public float xOffset;public float yOffset;

这里的Header没有实际意义就是一个标签。
为什么我们要设置偏移量,因为我们要生成房间就要有房间的位置,那么房间的位置就是通过从起始房间x,y偏移多少获得的。
接下来我们回的Unity来设置一下他们。
在这里插入图片描述
x、y轴的偏移量我们可以通过自己去拖拽我们的房间物体,来大概的获得一个我们觉得满意的位移距离。
这里我们以生成十个房间为例。
接下来我们处理生成预制体,即生成我们的房间,使用Instantiate方法即可,因为我们是一开始就生成房间,所以我们再Start方法里实现。
因为我们根据生成的房间数量来生成我们的房间,所以通过for语句循环生成。

    void Start(){for (int i = 0; i < rooNumber; i++){Instantiate(roomPrefab, generatorPoint.position, Quaternion.identity);}

这里为了方便我们后续直接使用我们的每一个房间,我们定义一个数组,将我们生成的房间放入数组里面,就可以直接使用了,所以我们做以下的更改。

    public List<GameObject> rooms = new List<GameObject>();// Start is called before the first frame updatevoid Start(){for (int i = 0; i < rooNumber; i++){rooms.Add(Instantiate(roomPrefab, generatorPoint.position, Quaternion.identity));}}

房间生成了,我们要改变我们每个房间的位置,但是问题来了,我们怎么随机的控制我们的房间生成再起始房间的上下左右呢?
这里就可以用到我们的枚举方法,我们可以将上下左右定义成一个枚举方法,枚举方法返回值是对应的数字,再通过Random来随机生成数字,即生成对应的方向,这里我们再通过Switch方法调用我们的四个方向分别定义我们的四个方法对位置的改变就可以了。

    public enum Direction { up,down,left,right };public Direction direction;public void ChangePointPos(){direction = (Direction)Random.Range(0, 4);switch (direction){case Direction.up:generatorPoint.position += new Vector3(0, yOffset, 0);break;case Direction.down:generatorPoint.position += new Vector3(0, -yOffset, 0);break;case Direction.left:generatorPoint.position += new Vector3(-xOffset, 0, 0);break;case Direction.right:generatorPoint.position += new Vector3(-xOffset, 0, 0);break;}}

然后我们再Start方法中调用这个方法,回到Unity中运行一下看看效果。
运行之后我们发现生成的房间数没有十个,这是为什么?
因为我们很多生成的房间都重合在一起了,我们怎么才可以避免这个问题的发生呢?
这里就要用到我们的Unity中的碰撞,并且新加一个碰撞层Layer,判断两个房间是否接触了。
首先给我们的预制体添加一个组件Rigidboby 2D,这个组件是为我们的物体添加刚体效果。
在这里插入图片描述
这里我们的刚体类型默认为Dynamic,他会给物体施加一个重力效果,物体会自由落体。
这里我们用到Static,将它设置成静态的刚体。
再加一个组件Box Collider 2D,一个盒型碰撞框,还有很多其他的碰撞框可以自行探索一下。
在这里插入图片描述
点击箭头所指的地方可以调整我们的碰撞框。
最后我们再新加一个碰撞层。
在这里插入图片描述
在这里插入图片描述
完成之后将我们的BasicRoom的碰撞层设置为Room
接下来我们就可以在脚本中判断一下两个房间是否发生碰撞,如果没有就生成新的房间,这里我们用到dowhile方法,因为我们一开始是要生成一个房间的。
我们首先要接收到这个层,并且在我们的Unity中把这个层赋值上去。
改进如下
在这里插入图片描述

    public LayerMask roomLayer;public void ChangePointPos(){do{direction = (Direction)Random.Range(0, 4);switch (direction){case Direction.up:generatorPoint.position += new Vector3(0, yOffset, 0);break;case Direction.down:generatorPoint.position += new Vector3(0, -yOffset, 0);break;case Direction.left:generatorPoint.position += new Vector3(-xOffset, 0, 0);break;case Direction.right:generatorPoint.position += new Vector3(-xOffset, 0, 0);break;}}while (Physics2D.OverlapCircle(generatorPoint.position,0.2f,roomLayer));}

这里我们使用了Physics2D.OverlapCircle方法,表示为第一个参数的位置,再第二个参数的范围内,是否碰撞了第三个参数所指的层。
接下来我们在运行一下游戏,发现这样就生成了十个随机位置的房间。
接下来我们要找到我们的开始房间和结束房间并且附上颜色,这里的结束房间并不是最后一个生成的房间,而是距离开始房间最远的那个房间,那我们要怎么找到它呢?
通过sqrMagnitude方法,这个方法是把一个三维向量的三个轴的值分别平方相加取到这个值,那么这样我们就可以得到我们的距离最远的那个房间了,找到之后给它我们一开始定义的endColor就可以了。

        private GameObject endRoom;rooms[0].GetComponent<SpriteRenderer>().color = startColor;endRoom = rooms[0];foreach (var room in rooms){if (room.transform.position.sqrMagnitude > endRoom.transform.position.sqrMagnitude){endRoom = room;}}endRoom.GetComponent<SpriteRenderer>().color = endColor;

我们通过获得SpriteRenderer组件来控制颜色。
使用Foreach语句来遍历我们的数组。
这样我们的随机房间算是大功告成了,我们来看一下效果。
在这里插入图片描述
这样我们之后就可以对房间里面的东西进行设置了!


总结

今天我们主要完成我们房间的随机生成,以及找到我们的开始房间和结束房间,这样方便我们后续对整个游戏的完成和地图的设置。

这篇关于Roguelike随机地下城 | 一、生成随机房间的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/303365

相关文章

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

C#使用Spire.XLS快速生成多表格Excel文件

《C#使用Spire.XLS快速生成多表格Excel文件》在日常开发中,我们经常需要将业务数据导出为结构清晰的Excel文件,本文将手把手教你使用Spire.XLS这个强大的.NET组件,只需几行C#... 目录一、Spire.XLS核心优势清单1.1 性能碾压:从3秒到0.5秒的质变1.2 批量操作的优雅

Python使用python-pptx自动化操作和生成PPT

《Python使用python-pptx自动化操作和生成PPT》这篇文章主要为大家详细介绍了如何使用python-pptx库实现PPT自动化,并提供实用的代码示例和应用场景,感兴趣的小伙伴可以跟随小编... 目录使用python-pptx操作PPT文档安装python-pptx基础概念创建新的PPT文档查看

在ASP.NET项目中如何使用C#生成二维码

《在ASP.NET项目中如何使用C#生成二维码》二维码(QRCode)已广泛应用于网址分享,支付链接等场景,本文将以ASP.NET为示例,演示如何实现输入文本/URL,生成二维码,在线显示与下载的完整... 目录创建前端页面(Index.cshtml)后端二维码生成逻辑(Index.cshtml.cs)总结

Python实现数据可视化图表生成(适合新手入门)

《Python实现数据可视化图表生成(适合新手入门)》在数据科学和数据分析的新时代,高效、直观的数据可视化工具显得尤为重要,下面:本文主要介绍Python实现数据可视化图表生成的相关资料,文中通过... 目录前言为什么需要数据可视化准备工作基本图表绘制折线图柱状图散点图使用Seaborn创建高级图表箱线图热

SQLServer中生成雪花ID(Snowflake ID)的实现方法

《SQLServer中生成雪花ID(SnowflakeID)的实现方法》:本文主要介绍在SQLServer中生成雪花ID(SnowflakeID)的实现方法,文中通过示例代码介绍的非常详细,... 目录前言认识雪花ID雪花ID的核心特点雪花ID的结构(64位)雪花ID的优势雪花ID的局限性雪花ID的应用场景

Django HTTPResponse响应体中返回openpyxl生成的文件过程

《DjangoHTTPResponse响应体中返回openpyxl生成的文件过程》Django返回文件流时需通过Content-Disposition头指定编码后的文件名,使用openpyxl的sa... 目录Django返回文件流时使用指定文件名Django HTTPResponse响应体中返回openp

python生成随机唯一id的几种实现方法

《python生成随机唯一id的几种实现方法》在Python中生成随机唯一ID有多种方法,根据不同的需求场景可以选择最适合的方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习... 目录方法 1:使用 UUID 模块(推荐)方法 2:使用 Secrets 模块(安全敏感场景)方法

Python实现自动化Word文档样式复制与内容生成

《Python实现自动化Word文档样式复制与内容生成》在办公自动化领域,高效处理Word文档的样式和内容复制是一个常见需求,本文将展示如何利用Python的python-docx库实现... 目录一、为什么需要自动化 Word 文档处理二、核心功能实现:样式与表格的深度复制1. 表格复制(含样式与内容)2