当前位置: 首页 > news >正文

Unity3D 房间去重叠化算法详解

前言
在Unity3D游戏开发中,经常需要生成和处理多个房间的场景,特别是在地牢生成、房屋布局或迷宫设计等应用中。为了确保生成的房间不会重叠,我们需要一种有效的去重叠化算法。以下将详细介绍该算法的原理和代码实现。
对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀!
算法原理
房间表示:
每个房间可以表示为一个矩形,其位置和大小由其在世界坐标系中的位置(x, y, z)以及宽度和高度决定。在Unity3D中,通常使用Rect组件或自定义的DungeonCell类来表示房间。
重叠检测:
重叠检测是判断两个房间是否相交的过程。这可以通过比较两个矩形的边界来实现。如果两个矩形的任意一边相交,则它们重叠。
移动房间:
一旦检测到重叠,就需要移动其中一个房间以避免重叠。移动的方向和距离可以根据重叠的严重程度来计算。一种简单的方法是计算两个房间中心点的差值,然后移动重叠的房间,使其中心点沿这个差值方向移动一定距离。
迭代处理:
由于移动一个房间可能会导致它与另一个房间重叠,因此需要迭代处理,直到所有房间都不重叠为止。
代码实现
以下是一个Unity3D中实现房间去重叠化算法的示例代码。

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using System.Linq;

public class DungeonCell : MonoBehaviour

{

public Rect CellRect { get; private set; }

public Vector3 Position { get; private set; }

public int Width { get; private set; }

public int Height { get; private set; }

public CellType cellType { get; set; }

public enum CellType

{

Normal,

Hall

}

public void CreateCell(int width, int height)

{

Width = width;

Height = height;

Position = transform.position;

CellRect = new Rect(Position.x - Width / 2, Position.z - Height / 2, Width, Height);

}

public void MoveTo(Vector3 position)

{

transform.position = position;

Position = position;

CellRect = new Rect(Position.x - Width / 2, Position.z - Height / 2, Width, Height);

}

public bool Overlap(DungeonCell comparedCell)

{

return CellRect.Overlaps(comparedCell.CellRect);

}

}

public class DungeonMaker : MonoBehaviour

{

public float CellCreationRadius = 150;

public int NumberOfCells = 40;

public int NumberOfHalls = 12;

public List<DungeonCell> cellsList = new List<DungeonCell>();

public int MinWidth = 3;

public int MaxWidth = 8;

public int MinLength = 3;

public int MaxLength = 8;

public float movementForce = 4.0f;

public List<DungeonCell> importantCells = new List<DungeonCell>();

void Start()

{

CreateCells();

SeparateCells();

MarkImportantCell();

}

private void CreateCells()

{

for (int i = 0; i < NumberOfCells; i++)

{

Vector2 Position2D = Random.insideUnitCircle * CellCreationRadius;

GameObject gameObjectPointer = new GameObject("Cell" + i);

DungeonCell cellPointer = gameObjectPointer.AddComponent<DungeonCell>();

cellPointer.CreateCell(Random.Range(MinWidth, MaxWidth + 1), Random.Range(MinLength, MaxLength + 1));

cellPointer.MoveTo(new Vector3(Position2D.x, 0, Position2D.y));

cellsList.Add(cellPointer);

}

}

private void SeparateCells()

{

bool allCellsNotOverlap = false;

while (!allCellsNotOverlap)

{

allCellsNotOverlap = true;

foreach (DungeonCell currentCell in cellsList)

{

Vector3 movementVector = Vector3.zero;

int numberOfOverlaps = 0;

foreach (DungeonCell comparedCell in cellsList)

{

if (currentCell == comparedCell) continue;

if (currentCell.Overlap(comparedCell))

{

movementVector += currentCell.transform.position - comparedCell.transform.position;

numberOfOverlaps++;

}

}

if (numberOfOverlaps != 0)

{

allCellsNotOverlap = false;

if (movementVector.magnitude > 0)

{

movementVector = movementVector.normalized * movementForce;

}

else

{

movementVector = Random.insideUnitCircle.normalized * movementForce;

}

currentCell.MoveTo(currentCell.transform.position + movementVector);

}

}

}

}

private void MarkImportantCell()

{

importantCells = cellsList.OrderByDescending(n => n.CellRect.width * n.CellRect.height).ToList();

for (int i = 0; i < NumberOfHalls; i++)

{

importantCells[i].cellType = DungeonCell.CellType.Hall;

}

}

}

技术详解
DungeonCell 类:
CreateCell 方法用于初始化房间的大小和位置,并计算其Rect边界。
MoveTo 方法用于更新房间的位置,并重新计算其Rect边界。
Overlap 方法用于检测两个房间是否重叠。

DungeonMaker 类:
CreateCells 方法用于随机生成指定数量的房间,并将它们添加到cellsList中。
SeparateCells 方法用于迭代处理房间重叠问题。通过计算重叠房间的移动向量,并将房间移动到新位置来避免重叠。
MarkImportantCell 方法用于根据房间大小将房间标记为重要房间(如大厅),以便后续处理。

通过该算法和代码实现,可以有效地解决Unity3D中房间重叠的问题,并为后续的房间布局和场景生成提供基础。
更多教学视频
Unity3D

www.bycwedu.com/promotion_channels/2146264125

相关文章:

Unity3D 房间去重叠化算法详解

前言 在Unity3D游戏开发中&#xff0c;经常需要生成和处理多个房间的场景&#xff0c;特别是在地牢生成、房屋布局或迷宫设计等应用中。为了确保生成的房间不会重叠&#xff0c;我们需要一种有效的去重叠化算法。以下将详细介绍该算法的原理和代码实现。 对惹&#xff0c;这里有…...

mybatis 配置文件完成增删改查(五) :单条件 动态sql查询,相当于switch

文章目录 单条件 动态sql查询写测试方法 疑问总结 单条件 动态sql查询 <select id"selectByConditionBySingle" resultMap"brandResultMap">.select *from tb_brandwhere<choose>/*相当于switch*/<when test"status ! null">…...

全球IP归属地查询-IP地址查询-IP城市查询-IP地址归属地-IP地址解析-IP位置查询-IP地址查询API接口

IP地址城市版查询接口 API是指能够根据IP地址查询其所在城市等地理位置信息的API接口。这类接口在网络安全、数据分析、广告投放等多个领域有广泛应用。以下是一些可用的IP地址城市版查询接口API及其简要介绍 1. 快证 IP归属地查询API 特点&#xff1a;支持IPv4 提供高精版、…...

Vue3+FastAPI中Token的刷新机制(含代码示例)

在Vue3和FastAPI的应用中&#xff0c;token刷新机制通常涉及以下几个步骤&#xff1a; 登录过程&#xff1a;用户登录时&#xff0c;后端FastAPI验证用户信息&#xff0c;验证通过后生成一个访问令牌&#xff08;access token&#xff09;和一个刷新令牌&#xff08;refresh t…...

【GAN 图像生成】

理论知识学习&#xff1a; PART 1&#xff1a; 生成对抗网络GAN 深度学习模型&#xff0c;用于生成数据 对抗式训练&#xff0c;生成器v判别器 DCGAN>WGAN>StyleGAN技术不断进化 GAN在艺术创作。数据增强领域应用越来越广泛 应用&#xff1a; GAN在图像合成&#x…...

【自然语言处理】词嵌入模型

词嵌入&#xff08;Word Embedding&#xff09; 是一种将词汇表示为实数向量的技术&#xff0c;通常是低维度的连续向量。这些向量被设计为捕捉词汇之间的语义相似性&#xff0c;使得语义相似的词在嵌入空间中的距离也更近。词嵌入可以看作是将离散的语言符号&#xff08;如单词…...

了解针对基座大语言模型(类似 ChatGPT 的架构,Decoder-only)的重头预训练和微调训练

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 随着自然语言处理&#xff08;NLP&#xff09;技术的飞速进步&#xff0c;基于 Transformer 架构的大语言模型在众多任务中取得了显著成就。特别是 Decoder-only 架构&#xff0c;如 GPT 系列模型&…...

cmake如何在编译时区分-std=c++17和-std=gnu++17?检查宏

如何在编译时区分-stdc17和-stdgnu17&#xff1f;检查宏&#xff1f;-腾讯云开发者社区-腾讯云 我正在使用__int128扩展的g。-stdc17的问题是&#xff0c;一些C库不具备对该扩展的全部支持(即std::make_unsigned<>失败)。当使用-stdgnu17时&#xff0c;它工作得很好。 我…...

速通数据结构与算法第七站 排序

系列文章目录 速通数据结构与算法系列 1 速通数据结构与算法第一站 复杂度 http://t.csdnimg.cn/sxEGF 2 速通数据结构与算法第二站 顺序表 http://t.csdnimg.cn/WVyDb 3 速通数据结构与算法第三站 单链表 http://t.csdnimg.cn/cDpcC 4 速通…...

灵当CRM index.php接口SQL注入漏洞复现 [附POC]

文章目录 灵当CRM index.php接口SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 灵当CRM index.php接口SQL注入漏洞复现 [附POC] 0x01 前言 免责声明&#xff1a;请勿利用文章内的相关技…...

修复: Flux女生脸不再油光满面, 屁股下巴 -- 超实用Comfyui小技巧

ComfyUI上目前最强画图模型公认为Flux. 初次用Flux基础模型画真实的女生时, 和SD比起来, 会觉得画出来细节更多, 更真实. 但是当画多了, 就会觉得画出来的女生总是似曾相识. 仔细观察, 会发现一些共同的特征. 人偏老气, 像30~50的女生. 改了提示词也效果不大. 颧骨凸起, 嘴…...

Actions Speak Louder than Words Meta史诗级的端到端推荐大模型落地

发现好久之前整理的推荐系统被遗忘在了草稿箱&#xff0c;让它出来见见世面。。。后续空了持续更新 文章目录 1.Background2.Related works2.1 典型推荐模型2.1.1 DIN2.1.2 DIEN2.1.3 SIM2.1.4 MMoE2.1.5 其他 2.2. 生成式推荐 3.Method3.1 统一特征空间3.2 重塑召回排序模型3.…...

金智维KRPA之Excel自动化

Excel自动化操作概述 Excel自动化主要用于帮助各种类型的企业用户实现Excel数据处理自动化&#xff0c;Excel自动化是可以从单元格、列、行或范围中读取数据&#xff0c;向其他电子表格或工作簿写入数据等活动。 通过相关命令&#xff0c;还可以对数据进行排序、进行格式…...

哪款宠物空气净化器能有效去除浮毛?希喂、352实测分享

你是否曾经站在家电卖场里&#xff0c;面对琳琅满目的宠物空气净化器产品而感到无所适从&#xff1f;或者在浏览网上商城时&#xff0c;被海量的参数和功能描述搞得头晕眼花&#xff1f;别担心&#xff0c;你不是一个人。在这个科技飞速发展的时代&#xff0c;选择一台既能满足…...

2024.9.28更换启辰R30汽车火花塞

2024.9.28周六汽车跑了11万公里&#xff0c;实在加速肉&#xff0c;起步顿挫&#xff0c;油耗在8个&#xff0c;决定更换火花塞。第一个火花塞要拆掉进气歧管。第二和第三个可以直接换。打开第二个火花塞一看电极都被打成深坑&#xff0c;针电极都被打凸。我有两个旧的火花塞&a…...

2024上海网站建设公司哪家比较好TOP3

判断一家网建公司的好坏&#xff0c;第一是看公司背景&#xff0c;包括成立时间&#xff0c;工商注册信息等&#xff0c;第二可以去看看建站公司做的案例&#xff0c;例如&#xff0c;网站开发、设计、引流等等的以往案例&#xff0c;了解清楚具体的业务流程。 一、公司背景 …...

TDesign组件库+vue3+ts 如何视觉上合并相同内容的table列?(自定义合并table列)

背景 当table的某一列的某些内容相同时&#xff0c;需要在视觉上合并这一部分的内容为同个单元格 如上图所示&#xff0c;比如需要合并当申请人为同个字段的列。 解决代码 <t-table:data"filteredData":columns"columns":rowspan-and-colspan"…...

BACnet协议-(基于ISO 8802-3 UDP)(2)

1、模拟设备的工具界面如下&#xff1a; 2、使用yet another bacnet explorer 用作服务&#xff0c;用于发现设备&#xff0c;界面如下&#xff1a; 3、通过wireshark 抓包如下&#xff1a; &#xff08;1&#xff09;、整体包如下&#xff1a; &#xff08;2&#xff09;、m…...

android 根据公历日期准确节气计算年月日时天干地支 四柱八字

1 年柱 判断当前日期是否超过本年的立春 未超过年份-1 已超过按当前年份计算 2月柱 当前日期是否超过当月的第一个节气 未超过-1 超过当前月份计算 节气对日柱时柱没影响。 获取某年某月第一个节气的准确日期 private int sTerm(int y, int n) {int[] sTermInfo…...

VMware虚拟机连接公网,和WindTerm

一、项目名称 vmware虚拟机连接公网和windterm 二、项目背景 需求1&#xff1a;windows物理机&#xff0c;安装了vmware虚拟机&#xff0c;需要访问公网资源&#xff0c;比如云服务商的yum仓库&#xff0c;国内镜像加速站的容器镜像&#xff0c;http/https资源。 需求2&#xf…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...