Unity3D 分块编辑小AStar地图详解

前言

A算法是一种经典的寻路算法,能够帮助游戏中的角色找到最短路径。在本文中,我们将介绍如何在Unity3D中使用分块编辑的方式创建一个小的A地图,并实现A*算法来实现角色的寻路。

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

1. 分块编辑小AStar地图的概念

在游戏开发中,A*算法是一种广泛应用的寻路算法,它可以在地图中找到两个点之间的最短路径。而分块编辑则是一种优化地图编辑的方式,将地图分成多个小块,每个小块可以看作是一个节点,这样可以减少计算量,提高寻路的效率。

2. 技术详解

2.1 创建地图

首先,我们需要创建一个地图,在Unity3D中可以使用Tilemap工具来快速创建地图。在创建地图时,我们可以将地图分成多个小块,并给每个小块一个标识,以便后续的寻路算法能够识别每个小块。

2.2 实现A*算法

接下来,我们需要实现A算法来进行角色的寻路。A算法是一种启发式搜索算法,它通过估算每个节点到目标节点的代价来找到最短路径。在实现A*算法时,我们需要考虑以下几个关键步骤:

  1. 初始化Open列表和Closed列表,Open列表用来存储待访问的节点,Closed列表用来存储已经访问过的节点;
  2. 将起始节点加入Open列表,并设置起始节点的代价为0;
  3. 重复以下步骤直到找到目标节点或Open列表为空:
  • 从Open列表中选择一个节点,该节点的代价加上到目标节点的估算代价最小;
  • 将该节点从Open列表中移除,并加入Closed列表;
  • 对该节点的相邻节点进行遍历,计算每个相邻节点的代价,并更新Open列表;
  • 如果找到目标节点,通过回溯可以得到最短路径。

2.3 角色移动

最后,我们需要实现角色的移动逻辑。当角色得到最短路径后,我们可以通过移动角色的位置来实现寻路效果。在移动过程中,可以使用插值的方式来平滑角色的移动,以提高游戏的流畅度。

3. 代码实现

下面是一个简单的Unity3D代码示例,演示了如何实现一个小的A*地图和角色的寻路:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class AStar : MonoBehaviour
{public Transform target; // 目标点public Transform player; // 角色public LayerMask obstacleMask; // 障碍物层private List<Node> path; // 最短路径void Start(){FindPath();}void FindPath(){Node startNode = new Node(player.position);Node targetNode = new Node(target.position);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 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();this.path = path;}List<Node> GetNeighbours(Node node){List<Node> neighbours = new List<Node>();// 实现获取邻居节点的逻辑return neighbours;}int GetDistance(Node nodeA, Node nodeB){// 实现计算两个节点之间距离的逻辑return 0;}void Update(){// 实现角色移动的逻辑}
}public class Node
{public bool walkable;public Vector3 position;public int gCost;public int hCost;public Node parent;public int fCost { get { return gCost + hCost; } }public Node(Vector3 _position){position = _position;}
}

在上面的代码示例中,我们实现了一个简单的A*算法,并通过Node类来表示地图中的节点。在FindPath方法中,我们首先初始化起始节点和目标节点,然后通过循环来遍历地图中的节点,找到最短路径。在RetracePath方法中,我们通过回溯来得到最短路径,最后在Update方法中实现角色的移动逻辑。

结论

通过本文的介绍,我们了解了如何在Unity3D中使用分块编辑的方式创建一个小的A地图,并实现A算法来实现角色的寻路。通过合理的分块编辑和A*算法的应用,我们可以提高游戏中角色的寻路效率,为玩家提供更好的游戏体验。希望本文对你有所帮助,谢谢阅读!

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

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

相关文章

FasterViT:英伟达提出分层注意力,构造高吞吐CNN-ViT混合网络 | ICLR 2024

论文设计了新的CNN-ViT混合神经网络FasterViT&#xff0c;重点关注计算机视觉应用的图像吞吐能力。FasterViT结合CNN的局部特征学习的特性和ViT的全局建模特性&#xff0c;引入分层注意力&#xff08;HAT&#xff09;方法在降低计算成本的同时增加窗口间的交互。在包括分类、对…

【InternLM 实战营第二期笔记】Lagent AgentLego 智能体应用搭建

理论知识 Lagent 是什么 Lagent 是一个轻量级开源智能体框架&#xff0c;旨在让用户可以高效地构建基于大语言模型的智能体。同时它也提供了一些典型工具以增强大语言模型的能力。 Lagent 目前已经支持了包括 AutoGPT、ReAct 等在内的多个经典智能体范式&#xff0c;也支持了…

主流微前端框架对比与选择策略

微前端是一种架构风格&#xff0c;旨在将大型前端应用程序拆分为多个独立的模块&#xff0c;这些模块可以独立开发、测试和部署。主流的微前端框架有以下几种&#xff1a; Single-SPA&#xff1a;Single-SPA 是一个超级父级框架&#xff0c;可以与其他前端框架集成&#xff0c;…

linux环境变量设置

windows环境变量设置步骤&#xff1a; 右键"我的电脑"高级设置环境变量编辑"用户变量"或者"系统变量" linux下环境变量的设置步骤&#xff1a; 修改/etc/profile添加如下格式条目&#xff1a; export MAVEN_HOME/usr/local/apache-maven-3.6…

C语言指针+-整数、指针-指针、指针关系运算、指针和数组、二级指针、指针数组

文章目录 前言一、指针 - 整数二、指针 - 指针三、指针的关系运算四、指针和数组五、二级指针六、指针数组指针数组可以将几个一维数组模拟成二维数组 总结 前言 C语言指针整数、指针-指针、指针关系运算、指针和数组、二级指针、指针数组等介绍&#xff0c;还包括指针数组将几…

武汉大学博士,华为上班5年多,月薪多少。。。

最近&#xff0c;一位来自武汉大学的博士研究生透露了自己在华为公司工作五年后的薪酬情况。 据他透露&#xff0c;他在2018年加入华为时的月薪为2.4万&#xff0c;随着时间的推移&#xff0c;到了2023年&#xff0c;他的月薪已经增长至4.4万&#xff01;此外&#xff0c;他还透…

工作后的自我介绍

您好&#xff0c;我叫Li&#xff0c;毕业于双一流**大学软件工程专业。 在大学期间通过四级&#xff0c;获得计算机C语言二级证书、科技立项奖&#xff08;词频统计&#xff09;、国家励志奖学金、优秀学生奖学金、优秀团干部、新生奖学金等。在校主修的课程有C、Java、数据结…

AI时代的GPU集群网络算力分析

浅谈GPU集群网络、集群规模和集群算力 引言在生成式AI&#xff08;GenAI&#xff09;和大模型时代&#xff0c;不仅需要关注单个GPU卡的算力&#xff0c;更要关注GPU集群的总有效算力。单个GPU卡的有效算力可以通过该卡的峰值算力来测算&#xff0c;例如&#xff0c;对于Nvidia…

class093 贪心经典题目专题5【左程云算法】

class093 贪心经典题目专题5【左程云算法】 前言版权推荐class093 贪心经典题目专题5最后 前言 2024-4-23 14:01:18 以下内容源自《【左程云算法】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN日星月云 博客主页是https://…

网络工程师----第十一天

OSPF&#xff1a; 对称加密算法&#xff1a; 也称为私钥加密或单密钥算法&#xff0c;是一种加密方式&#xff0c;其中加密和解密使用相同的密钥。这种算法的优点包括加密解密速度快、计算量小&#xff0c;适用于大量数据的加密。然而&#xff0c;它的缺点是密钥的安全性难以保…

SEHLL脚本编程---- Nginx日志分析6-统计每分钟的请求数

描述 假设Nginx的日志存储在nowcoder.txt里&#xff0c;内容如下&#xff1a; 192.168.1.20 - - [21/Apr/2020:14:12:49 0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefo…

深度相机(3D相机)

传统的RGB彩色相机称为2D相机&#xff0c; 只能得到2D的图像信息&#xff0c; 无法得到物体与相机的距离信息&#xff0c;也就是深度信息。 顾名思义&#xff0c; 深度相机除了获取2D信息&#xff0c;还能得到深度信息&#xff0c;也叫RGBD相机&#xff0c; 或3D相机。 顺便提…

被删除的照片和视频能找回吗?如何恢复手机删除的照片和视频?

手机里的照片和视频是我们记录生活的每一个瞬间&#xff0c;也是工作学习等场合经常用到的东西&#xff0c;一旦不慎丢失&#xff0c;将对我们造成很大损失。那么我们该如何恢复手机删除的照片和视频呢&#xff1f;通过掌握正确的恢复方法&#xff0c;能够最大程度地保护手机中…

网络常识!!!

网络常识!!! 一:网络的发展史二:关键的概念三:IP地址四:端口号二级目录二级目录二级目录二级目录三级目录 一:网络的发展史 从游戏方面发展历程进行理解: 从单机游戏-----游戏支持局域网对战-------游戏支持广域网对战-------移动端 (1)局域网对战:在同一个网吧里,不同的游戏…

2016年新华三杯复赛实验试题

2016年新华三杯复赛实验试题 拓扑图 配置需求 考生根据以下配置需求在 HCL 中的设备上进行相关配置。 以太网接口配置 将 S1、S2 的以太网接口 G1/0/1 至 G1/0/16 的模式用命令 combo enable copper 激活为电口。 虚拟局域网 为了减少广播&#xff0c;需要规划并配置 VLA…

Seurat -- Introduction to scRNA-seq integration 跟随学习记录

文章目录 数据是如何转换的原始ifnb数据对象Splits object后的数据对象数据对象构建完成后的标准流程Normalization后的数据对象scale 后的数据对象 不同的样本进行整合JoinLayers干了什么 数据是如何转换的 seurat object 中assays R N A l a y e r s RNAlayers RNAlayersco…

新的全息技术突破计算障碍

一种突破性的方法利用基于Lohmann透镜的衍射模型实时创建计算机生成全息图&#xff08;CGH&#xff09;&#xff0c;在保持3D可视化质量的同时&#xff0c;大大降低了计算负荷要求。 全息显示为制作逼真的三维图像提供了一条令人兴奋的途径&#xff0c;这种图像给人以连续深度…

在 Slurm 上运行 Jupyter

1. 背景介绍 现在的大模型训练越来越深入每个组了&#xff0c;大规模集群系统也应用的愈发广泛。一般的slurm系统提交作业分为2种&#xff0c;一种是srun&#xff0c;这种所见即所得的申请方式一般适用于短期的调试使用&#xff0c;大概一般允许的时间从几个小时到1天左右&…

【Camera Sensor Driver笔记】七、点亮指南之Flash

<flashDriverData> flashName adp1660 flash 名称 flashDriverType I2C PMIC / I2C &#xff08;PMIC为平台的&#xff0c;eg&#xff1a;flashname&#xff1a;pmic flashDriverType&#xff1a;PMIC&#xff09; <powerUpSe…

flutter 设置启屏页 flutter_native_splash 坑记录

flutter_native_splash | Flutter packageCustomize Flutters default white native splash screen with background color and splash image. Supports dark mode, full screen, and more.https://pub.dev/packages/flutter_native_splash 发现一直白屏 原因是 代码中 下面…