Unity3D AStar地图编辑与寻路测试详解

news/2024/5/25 10:35:52/文章来源:https://blog.csdn.net/Thomas_YXQ/article/details/136560308

前言

A算法是一种常用的寻路算法,能够帮助游戏对象在地图中找到最短路径。本文将详细介绍如何在Unity3D中使用A算法进行地图编辑和寻路测试。

对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀!

一、地图编辑

首先我们需要创建一个地图,可以使用Unity3D中的Tilemap功能来快速创建地图。在Unity3D中创建一个Tilemap,然后在Tile Palette中选择合适的地图块进行绘制。可以使用不同的地图块来表示不同的地形,比如墙壁、草地、水域等。在地图编辑中,我们需要定义每个地图块的通行能力,比如墙壁是不可通行的,草地是可通行的。

接下来我们需要将地图转换为一个二维数组,用来表示地图中每个位置的通行能力。可以使用一个二维数组来表示地图,其中1表示可通行,0表示不可通行。在Unity3D中可以使用Tilemap.GetTile来获取每个位置的地图块,然后根据地图块的类型来确定通行能力。

二、A*算法实现

在地图编辑完成后,我们可以使用A算法来进行寻路。A算法是一种启发式搜索算法,通过估计每个位置到目标位置的代价来选择最优路径。在Unity3D中实现A*算法需要定义一个Node类来表示地图中的每个位置,包括位置坐标、父节点、启发函数值等。然后我们需要定义一个OpenList和ClosedList来保存已经访问过的节点和待访问的节点。

A*算法的核心是计算每个节点的启发函数值,然后选择最小的启发函数值的节点进行扩展。在扩展节点时,需要考虑周围的邻居节点,计算它们的启发函数值并将其加入OpenList中。直到找到目标节点或者OpenList为空时算法结束。

三、代码实现

以下是一个简单的A*算法实现的代码示例:

using System.Collections.Generic;
using UnityEngine;public class AStar : MonoBehaviour
{private List<Node> OpenList = new List<Node>();private List<Node> ClosedList = new List<Node>();public List<Node> FindPath(Vector2Int start, Vector2Int end){Node startNode = new Node(start);Node endNode = new Node(end);OpenList.Add(startNode);while (OpenList.Count > 0){Node currentNode = GetLowestFNode(OpenList);OpenList.Remove(currentNode);ClosedList.Add(currentNode);if (currentNode.Equals(endNode)){return CalculatePath(startNode, currentNode);}List<Node> neighbors = GetNeighbors(currentNode);foreach (Node neighbor in neighbors){if (ClosedList.Contains(neighbor)){continue;}int newG = currentNode.G + 1;if (newG < neighbor.G || !OpenList.Contains(neighbor)){neighbor.G = newG;neighbor.H = CalculateH(neighbor, endNode);neighbor.Parent = currentNode;if (!OpenList.Contains(neighbor)){OpenList.Add(neighbor);}}}}return null;}private Node GetLowestFNode(List<Node> nodes){Node lowestNode = nodes[0];foreach (Node node in nodes){if (node.F < lowestNode.F){lowestNode = node;}}return lowestNode;}private List<Node> GetNeighbors(Node node){List<Node> neighbors = new List<Node>();// TODO: Add code to get neighbors of current nodereturn neighbors;}private int CalculateH(Node node, Node endNode){return Mathf.Abs(node.Position.x - endNode.Position.x) + Mathf.Abs(node.Position.y - endNode.Position.y);}private List<Node> CalculatePath(Node startNode, Node endNode){List<Node> path = new List<Node>();Node currentNode = endNode;while (!currentNode.Equals(startNode)){path.Add(currentNode);currentNode = currentNode.Parent;}path.Reverse();return path;}
}public class Node
{public Vector2Int Position;public int G;public int H;public Node Parent;public int F{get { return G + H; }}public Node(Vector2Int position){Position = position;}public override bool Equals(object obj){Node other = obj as Node;if (other == null){return false;}return Position.Equals(other.Position);}public override int GetHashCode(){return Position.GetHashCode();}
}

在上面的代码中,我们定义了一个AStar类来实现A*算法,其中包括FindPath方法用来寻找路径,GetLowestFNode方法用来获取OpenList中最小的F值节点,GetNeighbors方法用来获取当前节点的邻居节点,CalculateH方法用来计算启发函数值,CalculatePath方法用来计算最终路径。同时我们还定义了一个Node类来表示地图中的每个位置。

四、测试

最后我们可以在Unity3D中测试A*算法的效果。在场景中放置一个角色和一个目标点,然后调用AStar类的FindPath方法来获取路径。通过将路径上的位置连接起来,可以看到角色按照最短路径移动到目标点。

总结

本文介绍了在Unity3D中使用A算法进行地图编辑和寻路测试的详细过程,包括地图的创建、A算法的实现以及代码示例。通过使用A*算法,可以帮助游戏对象在复杂的地图中找到最短路径,提升游戏体验。希望本文对您有所帮助。

更多教学视频

Unity3D​www.bycwedu.com/promotion_channels/2146264125

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1006671.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C/C++程序设计实验报告2 | 循环结构实验

本文整理自博主学校大一&#xff08;2021级&#xff09;C/C专业课的课程实验报告&#xff0c;适合学弟妹或C语言初学者入门C语言学习、练习。 编译器&#xff1a;gcc 10.3.0 ---- 注&#xff1a; 1.虽然课程名为C程序设计&#xff0c;但实际上当时校内该课的内容大部分其实都是…

运动想象 (MI) 迁移学习系列 (4) : EEGNet-Fusion-V2

运动想象迁移学习系列:EEGNet-Fusion-V2 0. 引言1. 主要贡献2. 网络结构3. 实验结果3.1 不同参数的评估3.2 不同参数的评估3.3 与基准模型比较 4. 总结欢迎来稿 论文地址&#xff1a;https://www.mdpi.com/1424-8220/23/18/7908 论文题目&#xff1a;Excellent fine-tuning: F…

FPGA - 时钟Buffer的探究

1、IBUF : FPGA上所有的输入信号必须进过IBUF,vivado会自动给所有输入信号分配IBUF OBUF&#xff1a;FPGA上所有的输入信号必须进过IBUF,vivado会自动给所有输入信号分配OBUF BUFG:专用时钟的资源&#xff0c;目的是减少时钟抖动、增强时钟的驱动能力&#xff0c;vivado不会给信…

24计算机考研调剂 | 东北石油大学

东北石油大学智能物探团队招生宣传 考研调剂招生信息 学校:东北石油大学 专业:工学->地质资源与地质工程->矿产普查与勘探 年级:2024 招生人数:2 招生状态:正在招生中 联系方式:********* (为保护个人隐私,联系方式仅限APP查看) 补充内容 团队介绍&#xff1a; …

.NET高级面试指南专题十八【 外观模式模式介绍,提供了简化的接口,隐藏系统的复杂性】

介绍&#xff1a; 外观模式是一种结构设计模式&#xff0c;它提供了一个统一的接口&#xff0c;用于访问子系统中的一组接口。外观模式定义了一个高层接口&#xff0c;使得子系统更容易使用。 原理&#xff1a; 外观类&#xff08;Facade Class&#xff09;&#xff1a;提供了一…

PFA洗气瓶特氟龙连续洗气反应装置

洗气瓶是一种洗去气体中杂质的仪器&#xff0c;是将不纯气体通过选定的适宜液体介质鼓泡吸收&#xff08;溶解或由于发生化学反应&#xff09;&#xff0c;从而洗去杂质气体&#xff0c;以达净化气体的目的。在有可燃性气源的实验装置中&#xff0c;洗气瓶也可起到安全瓶的作用…

Github上哪些好用的工具

专注于web漏洞挖掘、内网渗透、免杀和代码审计&#xff0c;感谢各位师傅的关注&#xff01;网安之路漫长&#xff0c;与君共勉&#xff01; Qexo-爱写博客的师傅强烈推荐 漂亮的 Hexo 静态博客编辑器。该项目是基于 Django 的 Hexo 静态博客管理后台&#xff0c;支持文章管理、…

【C++教程从0到1入门编程】第八篇:STL中string类的模拟实现

一、 string类的模拟实现 下面是一个列子 #include <iostream> namespace y {class string{public: //string() //无参构造函数// :_str(nullptr)//{}//string(char* str) //有参构造函数// :_str(str)//{}string():_str(new char[1]){_str[0] \0;}string(c…

教师如何搭建学生查询考试分数的平台?

随着信息技术的快速发展&#xff0c;搭建一个学生查询考试分数的平台已经成为现代教育管理的重要组成部分。这样的平台不仅可以提高成绩管理的效率&#xff0c;还能为学生提供便捷、及时的成绩查询服务。那么&#xff0c;作为教师&#xff0c;我们应该如何搭建这样一个平台呢&a…

VC-旅游系统-213-(代码+说明)

转载地址: http://www.3q2008.com/soft/search.asp?keyword旅游系统 旅游信息管理系统开题报告 一、研究目的 旅游信息管理系统能帮助旅行社在游客的市场开拓、游客的信息管理、客户服务等方面进行综合处理。使旅行社能够准确的掌握客户的市场动态&#xff0c;充分了解对客户…

Python 常用的开源爬虫库介绍

Python 是一种广泛使用的编程语言&#xff0c;特别是在 Web 爬虫领域。有许多优秀的开源爬虫库可以帮助开发者高效地抓取网页内容。以下是几个常用的 Python 爬虫库及其特点和优势&#xff1a; BeautifulSoup 特点 - **HTML/XML 解析**&#xff1a;BeautifulSoup 是一个…

【node版本问题】运行项目报错 PostCSS received undefined instead of CSS string

最近该项目没有做任何修改&#xff0c;今天运行突然跑不起来报错了 PostCSS received undefined instead of CSS string 【原因】突然想起来期间有换过 node 版本为 16.17.1 【解决】将 node 版本换回之前的 14.18.0 就可以了

6.S081的Lab学习——Lab1: Xv6 and Unix utilities

文章目录 前言一、启动xv6(难度&#xff1a;Easy)解析&#xff1a; 二、sleep(难度&#xff1a;Easy)解析&#xff1a; 三、pingpong&#xff08;难度&#xff1a;Easy&#xff09;解析&#xff1a; 四、Primes(素数&#xff0c;难度&#xff1a;Moderate/Hard)解析&#xff1a…

基于SpringBoot的“心灵治愈交流平台”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“心灵治愈交流平台”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能界面图 登录、用户注册界面图 心灵专…

Windows电脑安装Linux(Ubuntu 22.04)系统(图文并茂)

Windows电脑安装Ubuntu 22.04系统&#xff0c;其它版本的Ubuntu安装方法相同 Ubuntu 16.04、Ubuntu 18.04安装方法相同&#xff0c;制作U盘启动项的镜像文件下载你需要的版本即可&#xff01; Ubuntu的中文官网网址&#xff1a;https://cn.ubuntu.com/&#xff0c;聪明的你一定…

ElasticSearch学习篇10_Lucene数据存储之BKD动态磁盘树

前言 基础的数据结构如二叉树衍生的的平衡二叉搜索树通过左旋右旋调整树的平衡维护数据&#xff0c;靠着二分算法能满足一维度数据的logN时间复杂度的近似搜索。对于大规模多维度数据近似搜索&#xff0c;Lucene采用一种BKD结构&#xff0c;该结构能很好的空间利用率和性能。 …

IO学习--02

标准IO由ANSI C库说明&#xff0c;在很多系统都实现了标准IO库。标准IO库处理很多细节&#xff0c;如缓冲的分配、优化长度执行IO等&#xff0c;使得用户不需要考虑选择合适的长度。标准IO是在系统调用函数构建的&#xff0c;便于用户使用。 标准IO的所有操作都是围绕流&#x…

如何安装“Ubuntu 20.04桌面版,在win10系统“?

一、 下载 https://ubuntu.com/tutorials/install-ubuntu-desktop#get-ubuntu 二、安装 1、 2、 3、 4、 5、 6、 7、 8、 9、 10、 11、 12、关闭安装&#xff0c;设置-分辨率 13、 14、 15、 16、 17、 18、 19、 20、等待安装 21、

C#,数值计算,希尔伯特矩阵(Hilbert Matrix)的算法与源代码

Hilbert, David (1862-1943) 1 希尔伯特(Hilbert) 德国数学家,在《几何学基础》中提出了第一套严格的几何公理(1899年)。他还证明了自己的系统是自洽的。他发明了一条简单的空间填充曲线,即埃里克魏斯汀的数学世界,即希尔伯特曲线,埃里克魏斯汀的数学世界,并证明了不…

Unity资源热更新----AssetBundle

13.1 资源热更新——AssetBundle1-1_哔哩哔哩_bilibili Resources 性能消耗较大 Resources文件夹大小不能超过2个G 获取AssetBundle中的资源 打包流程 选择图片后点击 创建文件夹&#xff0c;Editor优先编译 打包文件夹位置 using UnityEditor; using UnityEngine; public cla…