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

前言

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.mzph.cn/news/729548.shtml

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

相关文章

第四节 LLAVA模型推理命令(包含lora训练权重推理方法)

文章目录 前言一、模型推理公用命令二、模型自带推理命令1、整个文件命令2、模型自带fitune推理3、clip推理三、个人lora训练推理命令1、使用命令推理2、vscode推理前言 LLAVA模型训练方式有预训练、微调训练,而预训练需要大量算力与数据支持,我们将不在重点考虑。对于微调,…

K8S之实现业务的金丝雀发布

如何实现金丝雀发布 金丝雀发布简介优缺点在k8s中实现金丝雀发布 金丝雀发布简介 金丝雀发布的由来&#xff1a;17 世纪&#xff0c;英国矿井工人发现&#xff0c;金丝雀对瓦斯这种气体十分敏感。空气中哪怕有极其微量的瓦斯&#xff0c;金丝雀也会停止歌唱&#xff1b;当瓦斯…

【JS逆向学习】猿人学 第五题 js混淆 乱码

逆向目标 网址&#xff1a;https://match.yuanrenxue.cn/match/5接口&#xff1a;https://match.yuanrenxue.cn/api/match/5?page2&m1709806560791&f1709806560000参数&#xff1a; Cookie(m、RM4hZBv0dDon443M)payload(m、f) 逆向过程 老规矩&#xff0c;上来先分…

电商api数据接口开发采集淘宝实时详情页,销量,库存,sku,图片,链接等参数接入key获取方式

淘宝实时详情页的API数据接口开发涉及到多个参数的采集&#xff0c;包括销量、库存、SKU、图片、链接等。要实现这一功能并获取接入Key&#xff0c;您需要按照以下步骤操作&#xff1a; 注册开放平台账号&#xff1a;您需要在淘宝开放平台注册一个账号。创建应用&#xff1a;在…

错误笔记:不支援 10 验证类型、org.postgresql.util.PSQLException

1、不支援 10 验证类型。请核对您已经组态 pg_hba.conf 文件包含客户端的IP位址或网路区段&#xff0c;以及驱动程序所支援的验证架构模式已被支援。 解决方法&#xff1a; 找到C:\Program Files\PostgreSQL\13\data目录下的pg_hba.conf将下列注释掉 # TYPE DATABASE …

第24集《灵峰宗论导读》

请大家打开讲义第79面。 在第一段呢蕅益大师先讲到这个诸法实相的妙理&#xff0c;说从我们现前一念心性来观察诸法实相有两个角度&#xff1a; 第一个角度呢就是当我们摄用归体的时候&#xff0c;所谓万法唯识一心的时候&#xff0c;这个时候我们会发觉三世诸佛&#xff0c;…

vue实现文字手工动态打出效果

vue实现文字手工动态打出效果 问题背景 本文实现vue中&#xff0c;动态生成文字手动打出效果。 问题分析 话不多说&#xff0c;直接上代码&#xff1a; <template><main><button click"makeText"><p class"text">点击生成内容…

Cisco IOS 使用 IP SLA 状态作为静态路由的开关

Cisco IOS 和 IOS XE 作为最普及的路由器和交换机操作系统&#xff0c;内建强大的状态跟踪联动能力。 我们配置网络设备时&#xff0c;希望设备能主动发现网络故障&#xff0c;及时作出相应调整&#xff0c;并将故障状态传递给网络的其他部分&#xff0c;减少故障恢复时的人工…

【Java】ruoyi框架,添加ShardingJdbc支持分库分表

1、 调研&#xff0c;目前主流的有Mycat、Sharding Jdbc &#xff0c;准备选用后者&#xff1b; 分库分表&#xff0c;一种是按照时间范围进行&#xff0c;另外一种按照某个字段为分片键&#xff1b; 我这里&#xff0c;选用表数据中的DeptId字段作为分片键&#xff0c;这样能…

启动vue项目执行npm run serve报错 : error in ./src/element-variables.scss

error in ./src/element-variables.scss 问题原因 node-sass的版本问题 解决方式 我直接更新了一下node-sass&#xff0c;就好了 npm install node-sass 再次执行就可以执行成功了

如何设置WhatsApp Business账号?

WhatsApp Business是WhatsApp为企业打造的一款应用程序&#xff0c;旨在帮助企业与客户更轻松地互动。如果您是一家出海企业&#xff0c;想要更好地与客户沟通&#xff0c;那么WhatsApp Business账号是您不可或缺的工具。 以下是设置WhatsApp Business账号的步骤&#xff1a; …

AIGC绘画关键词 - 写实少女

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

【栈】20. 有效的括号

20. 有效的括号 思路总结 解决这个问题的关键是使用栈&#xff08;Stack&#xff09;这一数据结构。算法的核心思想是&#xff0c;当遍历到一个左括号时&#xff0c;将其压入栈中&#xff1b;当遍历到一个右括号时&#xff0c;尝试从栈顶弹出一个元素&#xff0c;并检查这个栈…

MongoDB黑窗口操作(CRUD)

目录 连接数据库 插入数据 for循环插入数据 根据条件查询 修改数据 删除数据 连接数据库 对应路径下cmd中输入命令mongo即可 插入数据 j{name:"mongo"} t{x:3} 提交&#xff1a;db.things.svae(j);db.things.svae(t); 查询&#xff1a;db.things.find(); …

Maven的settings.xml配置

maven的两大配置文件&#xff1a;settings.xml和pom.xml。其中settings.xml是maven的全局配置文件&#xff0c;pom.xml则是文件所在项目的局部配置 标签servers&#xff1a; 一般&#xff0c;仓库的下载和部署是在pom.xml文件中的repositories和distributionManagement元素中定…

Java面试挂在线程创建后续,不要再被八股文误导了!创建线程的方式只有1种

线程创建之源 OK&#xff01;咱们闲话少叙&#xff0c;直接进入正题&#xff0c;回顾一下通过实现Runnable接口&#xff0c;重写run方法创建线程的方式&#xff0c;真的可以创建一个线程吗&#xff1f;来看下面这段demo。 【代码示例1】 public class Test implements Runnab…

深入理解 Java 方法重载与递归应用

Java 方法重载 方法重载 允许在同一个类中定义多个具有相同名称的方法&#xff0c;但 参数列表 必须不同。 语法&#xff1a; returnType methodName(parameter1, parameter2, ..., parameterN) {// 方法体 }示例&#xff1a; public class Main {// 重载 add 方法&#xf…

信号处理--使用CNN+LSTM实现单通道脑电信号EEG的睡眠分期评估

目录 背景 亮点 环境配置 数据 方法 结果 代码获取 参考文献 背景 睡眠对人体健康很重要。监测人体的睡眠分期对于人体健康和医疗具有重要意义。 亮点 架构在第一层使用两个具有不同滤波器大小的 CNN 和双向 LSTM。 CNN 可以被训练来学习滤波器&#xff0c;以从原始…

redis缓存(穿透, 雪崩, 击穿, 数据不一致, 数据并发竞争 ), 分布式锁(watch乐观锁, setnx, redission)

redis的watch缓存机制 WATCH 机制原理&#xff1a; WATCH 机制&#xff1a;使用 WATCH 监视一个或多个 key , 跟踪 key 的 value 修改情况&#xff0c;如果有key 的 value 值在事务 EXEC 执行之前被修改了&#xff0c;整个事务被取消。EXEC 返回提示信息&#xff0c;表示 事务已…

JavaEE面试题

一、String面试题 1、String s1 "123"; 和 String s2 new String("123");的区别 在Java中&#xff0c;"String s1 "123";"和"String s2 new String("123");"这两行代码有一些重要的区别&#xff1a; "…