Unity AStar寻路算法与导航
在游戏开发中,寻路算法是一个非常重要的部分,它决定了游戏中角色的移动路径。Unity作为一款流行的游戏开发引擎,提供了许多内置的寻路算法,其中最常用的就是AStar算法。AStar算法是一种基于图的搜索算法,通过启发式搜索来找到最短路径。在本文中,我们将介绍Unity中的AStar寻路算法的使用方法,并给出相应的代码实现。
对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。
- 创建地图
首先,我们需要创建一个地图来进行寻路。在Unity中,我们可以使用Tilemap来创建一个二维地图。可以通过Tilemap的网格来表示地图中的障碍物和可通行区域。在创建地图时,需要确保地图中包含起点和终点,并且起点和终点都是可通行的区域。
- 导入AStar算法
Unity中并没有内置AStar算法,但我们可以通过导入第三方库来实现AStar寻路。其中一个常用的AStar算法库是A* Pathfinding Project。可以在Unity Asset Store中下载该库,并导入到项目中。
- 设置AStar组件
在导入A* Pathfinding Project后,我们需要给地图添加AStar组件。在Unity中,可以通过在Hierarchy面板中选择地图对象,然后点击Add Component按钮来添加AStar组件。在AStar组件中,需要设置起点和终点的位置,并指定地图中的障碍物和可通行区域。
- 寻路计算
一旦设置好AStar组件,我们就可以开始进行寻路计算了。可以通过调用AStar组件的FindPath方法来计算起点到终点的最短路径。在计算完成后,AStar组件会返回一个路径列表,其中包含了经过的所有节点。
- 移动角色
最后,我们需要将角色移动到计算得到的路径上。可以通过在Update方法中不断更新角色的位置来实现移动。在更新角色位置时,需要根据路径列表中的节点来确定下一个位置,并让角色向该位置移动。当角色到达终点时,寻路完成。
总结
通过以上步骤,我们可以在Unity中实现AStar寻路算法,并实现角色的导航。AStar算法是一种高效的寻路算法,可以应用于各种类型的游戏中。希望本文对大家有所帮助,可以在自己的游戏项目中尝试使用AStar算法来实现角色的移动路径。
Copy
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class AStarPathfinding : MonoBehaviour
{public Transform startPoint;public Transform endPoint;private Grid grid;void Start(){grid = GetComponent<Grid>();FindPath(startPoint.position, endPoint.position);}void FindPath(Vector3 startPos, Vector3 targetPos){Node startNode = grid.NodeFromWorldPoint(startPos);Node targetNode = grid.NodeFromWorldPoint(targetPos);List<Node> openSet = new List<Node>();HashSet<Node> closedSet = new HashSet<Node>();openSet.Add(startNode);while (openSet.Count > 0){Node currentNode = openSet[0];for (int i = 1; i < openSet.Count; i++){if (openSet[i].fCost < currentNode.fCost || openSet[i].fCost == currentNode.fCost && openSet[i].hCost < currentNode.hCost){currentNode = openSet[i];}}openSet.Remove(currentNode);closedSet.Add(currentNode);if (currentNode == targetNode){RetracePath(startNode, targetNode);return;}foreach (Node neighbour in grid.GetNeighbours(currentNode)){if (!neighbour.walkable || closedSet.Contains(neighbour)){continue;}int newCostToNeighbour = currentNode.gCost + GetDistance(currentNode, neighbour);if (newCostToNeighbour < neighbour.gCost || !openSet.Contains(neighbour)){neighbour.gCost = newCostToNeighbour;neighbour.hCost = GetDistance(neighbour, targetNode);neighbour.parent = currentNode;if (!openSet.Contains(neighbour)){openSet.Add(neighbour);}}}}}void RetracePath(Node startNode, Node endNode){List<Node> path = new List<Node>();Node currentNode = endNode;while (currentNode != startNode){path.Add(currentNode);currentNode = currentNode.parent;}path.Reverse();grid.path = path;}int GetDistance(Node nodeA, Node nodeB){int dstX = Mathf.Abs(nodeA.gridX - nodeB.gridX);int dstY = Mathf.Abs(nodeA.gridY - nodeB.gridY);if (dstX > dstY){return 14 * dstY + 10 * (dstX - dstY);}return 14 * dstX + 10 * (dstY - dstX);}
}
以上是一个简单的AStar寻路算法的代码实现。在这个代码中,我们通过遍历地图中的节点来计算最短路径,并将路径保存在grid.path中。希望这段代码能够帮助大家理解AStar算法的实现原理,并在自己的项目中使用。
相关文章:
Unity AStar寻路算法与导航
在游戏开发中,寻路算法是一个非常重要的部分,它决定了游戏中角色的移动路径。Unity作为一款流行的游戏开发引擎,提供了许多内置的寻路算法,其中最常用的就是AStar算法。AStar算法是一种基于图的搜索算法,通过启发式搜索…...
JavaScript最新实现城市级联操作,json格式的数据
前置知识: <button onclick"doSelect()">操作下拉列表</button><hr>学历:<select id"degree"><option value"0">--请选择学历--</option><option value"1">专科<…...
SD NAND:为车载显示器注入智能与安全的心脏
SD NAND 在车载显示器的应用 在车载显示器上,SD NAND(Secure Digital NAND)可以有多种应用,其中一些可能包括: 导航数据存储: SD NAND 可以用于存储地图数据、导航软件以及车载系统的相关信息。这有助于提…...
矩阵的对角化
概述 对角化矩阵是线性代数中的一个重要概念,它涉及将一个方阵转换成一个对角阵,这个对角阵与原矩阵相似,其主要对角线上的元素为原矩阵的特征值。这样的转换简化了很多数学问题,特别是线性动力系统的求解和矩阵的幂运算。下面是…...
React编写组件时,如何省略.tsx后缀
省略.tsx后缀 当tsconfig.json配置了,需要重启后才会生效 {"compilerOptions": {"allowJs": true,"jsx": "react-jsx",} }当进行以上配置后,导入组件时添加后缀,Eslint报错如下: An im…...
移动端的React项目中如何配置自适应和px转rem
创建项目 create-react-app project-name 启动项目 npm start 下载自适应和px转rem的插件 自适应的: npm install lib-flexible --save px转rem的:npm install postcss-pxtorem5.1.1 --save-dev 创建craco.config.js配置文件 在package.json中…...
TypeScript 结合 React 开发时候 , React.FunctionComponent 解释
在 TypeScript 结合 React 开发时,React.FC(或 React.FunctionComponent)是一个泛型类型,它用于定义函数组件的类型。这个类型定义了函数组件的结构和预期行为,并且提供了泛型支持,以便你可以指定组件 prop…...
2280. 最优标号(最小割,位运算)#困难,想不到
活动 - AcWing 给定一个无向图 G(V,E),每个顶点都有一个标号,它是一个 [0,2^31−1] 内的整数。 不同的顶点可能会有相同的标号。 对每条边 (u,v),我们定义其费用 cost(u,v) 为 u 的标号与 v 的标号的异或值。 现在我们知道一些顶点的标号…...
RestTemplate启动问题解决
⭐ 作者简介:码上言 ⭐ 代表教程:Spring Boot vue-element 开发个人博客项目实战教程 ⭐专栏内容:个人博客系统 ⭐我的文档网站:http://xyhwh-nav.cn/ RestTemplate启动问题解决 问题:在SpringCloud架构项目中配…...
Docker部署前后端服务示例
使用Docker部署js前端 1.创建Dockerfile 在项目跟目录下创建Dockerfile文件: # 使用nginx作为基础镜像 FROM nginx:1.19.1# 指定工作空间 WORKDIR /data/web# 将 yarn build 打包后的build文件夹添加到工作空间 ADD build build# 将项目必要文件添加到工作空间&a…...
方格分割644--2017蓝桥杯
1.用dfs解决,首先这题的方格图形就很像一个走迷宫的类型,迷宫想到dfs,最中心点视为起点,起点有两个小人在这个方格里面对称行动,直到走出迷宫(一个人走出来了另一个人就也走出来了,而走过的点会…...
接口测试用例设计注意点
API接口测试: 1>根据接口文档,检查接口调用方法post/get,状态码、请求值、返回值 2>对请求参数做容错、边界值、等价类校验 3>功能可用,用户友好 4>密码加密,http明文,https协议密文 5>业务…...
学习linux从0到工程师(命令)-4
基本命令 uname -m 显示机器的处理器架构 uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 (SMBIOS / DMI) hdparm -i /dev/hda 罗列一个磁盘的架构特性 hdparm -tT /dev/sda 在磁盘上执行测试性读取操作系统信息 arch 显示机器的处理器架构 uname -m 显示机器…...
【树莓派系统配置+python3.8+环境配置踩坑点汇总】raspberrypi
最近又开始搞树莓派的深度学习模型。很多windows端的环境需要在树莓派上重新部署,中间出现了非常多的问题。主要以各种库的下载安装为主要。 首先,第一个问题: 树莓派系统烧录之后,默认apt一般需要升级看,而默认下载…...
CTFHUB--文件包含漏洞--RCE
文件包含漏洞 文件包含漏洞也是一种注入型漏洞,其本质就是输入一段用户能够控制的脚本或者代码,并让服务端执行。有时候由于网站功能需求,会让前端用户选择要包含的文件,而开发人员又没有对要包含的文件进行安全考虑,…...
Android 解决引入的三方库中类名冲突问题
参考: Android开发——如何解决三方库中的类名冲突问题_android 类冲突-CSDN博客 Android 解决 jar/aar 包类名冲突 - 简书 实操步骤 1.提前安装好unzip-5.51-bin,proguard-7.4.0,jarjar-1.4软件 2.解压包名冲突的 AAR 文件 进入到需要修…...
扩展学习|大数据分析的现状和分类
文献来源:[1] Mohamed A , Najafabadi M K , Wah Y B ,et al.The state of the art and taxonomy of big data analytics: view from new big data framework[J].Artificial Intelligence Review: An International Science and Engineering Journal, 2020(2):53. 下…...
java学习笔记-初级
完整笔记下载链接:https://download.csdn.net/download/qq_48257021/88800766?spm1001.2014.3001.5503 一、变量 1.双标签 <!-- 外部js script 双标签 --><script srcmy.js></script> 在新文件my.js里面写: 2.字符串定义ÿ…...
使用axios 封装大文件上传,支持断点续传的功能
使用 Axios 实现断点续传、重试、暂停、开始和上传进度功能 简介 在许多应用程序中,我们经常需要上传大文件。但是,由于网络连接不稳定或其他原因,上传过程可能会中断。为了解决这个问题,我们可以使用断点续传功能。断点续传允许…...
在python中,设置json支持中文字符串
# 省略以上环节 ... # 假设json格式如下 system_info_dict {uptime: uptime.split(".")[0],cpu_usage: cpu_usage,memory_usage: memory_usage,disk_usage: disk_usage,battery_percentage: battery_percentage,battery_status: batteryStatus }# 设置json支持中文字…...
5分钟掌握Android设备安全检测:Play Integrity API Checker全面指南
5分钟掌握Android设备安全检测:Play Integrity API Checker全面指南 【免费下载链接】play-integrity-checker-app Get info about your Device Integrity through the Play Intergrity API 项目地址: https://gitcode.com/gh_mirrors/pl/play-integrity-checker-…...
AWPortrait-Z功能体验:批量生成、历史记录恢复等实用功能详解
AWPortrait-Z功能体验:批量生成、历史记录恢复等实用功能详解 1. 从安装到启动:快速上手指南 如果你刚接触AI图像生成,可能会觉得部署一个模型很复杂。但AWPortrait-Z在这方面做得相当友好,它把复杂的模型封装成了一个开箱即用的…...
基于MPC与事件触发通信的多智能体协同路径跟踪代码功能说明
无人船编队 无人车编队 MPC 模型预测控制 多智能体协同控制 一致性 MATLAB 无人车 USV 带原文献一、代码整体架构与核心目标 1. 核心目标 本套MATLAB源码针对多智能体协同路径跟踪(Cooperative Path Following, CPF) 问题,实现了受输入约束&a…...
[具身智能-354]:定制化无人机系统的组成
无人机系统整体采用“平台-链路-指控-保障”一体化架构,主要由以下核心分系统、软件数字架构及配套接口模块构成:一、 无人机飞行平台机体与起降结构:高强度轻量化机身、起落架及高原/大风环境适应性设计,支撑安全起降与地面滑行。…...
通义千问1.5-1.8B-Chat-GPTQ-Int4实战:Java面试题智能解答助手
通义千问1.5-1.8B-Chat-GPTQ-Int4实战:Java面试题智能解答助手 最近在帮团队筛选Java开发,也顺便辅导了几个准备跳槽的朋友,发现大家准备面试的方式还挺“复古”的。要么是抱着厚厚的面试宝典死记硬背,要么是在网上搜罗各种零散的…...
三分钟快速部署!DOL游戏汉化美化整合包完全指南
三分钟快速部署!DOL游戏汉化美化整合包完全指南 【免费下载链接】DOL-CHS-MODS Degrees of Lewdity 整合 项目地址: https://gitcode.com/gh_mirrors/do/DOL-CHS-MODS 还在为英文游戏界面烦恼吗?想要为游戏角色换上精美立绘却不知从何下手&#x…...
【读书笔记】《释放想象》
《释放想象》解读 作者:马克辛格林(Maxine Greene) 解读人:林晓英(北京大学教育学院)引言:一本写于1995年的预言之书 2018年,一篇题为《这块屏幕可能改变命运》的文章刷遍朋友圈&…...
CTF-NetA:零基础也能快速定位网络流量中的隐藏Flag
CTF-NetA:零基础也能快速定位网络流量中的隐藏Flag 【免费下载链接】CTF-NetA CTF-NetA是一款专门针对CTF比赛的网络流量分析工具,可以对常见的网络流量进行分析,快速自动获取flag。 项目地址: https://gitcode.com/gh_mirrors/ct/CTF-NetA…...
Youtu-Parsing快速开始:单图片模式、批量处理模式、输出格式详解
Youtu-Parsing快速开始:单图片模式、批量处理模式、输出格式详解 1. 项目概述 Youtu-Parsing是腾讯优图实验室推出的专业文档解析模型,基于Youtu-LLM-2B构建,能够智能识别文档中的多种元素: 文本内容:精准OCR文字识…...
Ardupilot 失控保护机制全解析:从参数配置到实战测试
1. 失控保护机制的重要性 第一次在户外测试无人机时,我眼睁睁看着自己的四轴飞行器因为遥控信号中断像石头一样坠向地面。那次惨痛经历让我深刻理解到:失控保护不是可选功能,而是飞行安全的最后防线。Ardupilot的失控保护机制就像汽车的安全气…...
