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

相关文章

使用C#如何创建人名或其他物体随机分组

《使用C#如何创建人名或其他物体随机分组》文章描述了一个随机分配人员到多个团队的代码示例,包括将人员列表随机化并根据组数分配到不同组,最后按组号排序显示结果... 目录C#创建人名或其他物体随机分组此示例使用以下代码将人员分配到组代码首先将lstPeople ListBox总结C#创建人名或其他物体随机分组

详解Java中如何使用JFreeChart生成甘特图

《详解Java中如何使用JFreeChart生成甘特图》甘特图是一种流行的项目管理工具,用于显示项目的进度和任务分配,在Java开发中,JFreeChart是一个强大的开源图表库,能够生成各种类型的图... 目录引言一、JFreeChart简介二、准备工作三、创建甘特图1. 定义数据集2. 创建甘特图3.

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

AI一键生成 PPT

AI一键生成 PPT 操作步骤 作为一名打工人,是不是经常需要制作各种PPT来分享我的生活和想法。但是,你们知道,有时候灵感来了,时间却不够用了!😩直到我发现了Kimi AI——一个能够自动生成PPT的神奇助手!🌟 什么是Kimi? 一款月之暗面科技有限公司开发的AI办公工具,帮助用户快速生成高质量的演示文稿。 无论你是职场人士、学生还是教师,Kimi都能够为你的办公文

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

poj 1287 Networking(prim or kruscal最小生成树)

题意给你点与点间距离,求最小生成树。 注意点是,两点之间可能有不同的路,输入的时候选择最小的,和之前有道最短路WA的题目类似。 prim代码: #include<stdio.h>const int MaxN = 51;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int P;int prim(){bool vis[MaxN];

poj 2349 Arctic Network uva 10369(prim or kruscal最小生成树)

题目很麻烦,因为不熟悉最小生成树的算法调试了好久。 感觉网上的题目解释都没说得很清楚,不适合新手。自己写一个。 题意:给你点的坐标,然后两点间可以有两种方式来通信:第一种是卫星通信,第二种是无线电通信。 卫星通信:任何两个有卫星频道的点间都可以直接建立连接,与点间的距离无关; 无线电通信:两个点之间的距离不能超过D,无线电收发器的功率越大,D越大,越昂贵。 计算无线电收发器D

hdu 1102 uva 10397(最小生成树prim)

hdu 1102: 题意: 给一个邻接矩阵,给一些村庄间已经修的路,问最小生成树。 解析: 把已经修的路的权值改为0,套个prim()。 注意prim 最外层循坏为n-1。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstri

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言