Godot2D角色导航-自动寻路教程(Godot获取导航路径)

文章目录

  • 开始准备
  • 获取路径
    • 全局点坐标

开始准备

首先创建一个导航场景,具体内容参考下列文章:
Godot实现角色随鼠标移动
然后我们需要设置它的导航目标位置,具体关于位置的讲解在下面这个文章:
Godot设置导航代理的目标位置

获取路径

获取路径我们需要使用GetNextPathPosition()方法,在将物体的目标位置设置好了之后,我们就可以通过这个方法来获取可以移动到目标位置的路线。
GetNextPathPosition()方法返回下一个全局坐标系中可以移动到的位置,并且可以确保路径上没有静态对象。如果代理没有找到一条可以移动的路径,它将返回代理父级的位置。

使用该方法的示例代码如下:

using Godot;public partial class MyCharacterBody2D : CharacterBody2D
{private NavigationAgent2D _navigationAgent;public override void _Ready(){base._Ready();_navigationAgent = GetNode<NavigationAgent2D>("NavigationAgent2D");}public override void _PhysicsProcess(double delta){base._PhysicsProcess(delta);Vector2 nextPathPosition = _navigationAgent.GetNextPathPosition();}
}

注意,我们获取到的是全局的坐标,而不是局部坐标或者说是方向向量,但是我们可以通过一些手段,来将其计算为方向向量,供我们移动,示例代码如下:

		Vector2 currentAgentPosition = GlobalTransform.Origin;Vector2 nextPathPosition = _navigationAgent.GetNextPathPosition();Velocity = currentAgentPosition.DirectionTo(nextPathPosition) * _movementSpeed;MoveAndSlide();

这段代码在每个物理帧中通过路径导航系统,将代理角色移动到下一个路径位置。首先,我们定义了一个currentAgentPosition变量,通过GlobalTransform.Origin获取代理角色的当前位置,即全局坐标系的原点位置。

使用_navigationAgent.GetNextPathPosition()方法获取下一个路径位置,并将其存储在nextPathPosition变量中。

通过currentAgentPosition.DirectionTo(nextPathPosition)方法获取一个指向下一个路径位置的向量,然后乘以_movementSpeed变量来确定角色移动的速度。

使用MoveAndSlide()方法将代理角色根据计算得到的速度进行移动。该方法会自动处理碰撞和滑动,使得代理角色在不与障碍物发生碰撞的情况下移动到目标位置。

全局点坐标

我们通过GetNextPathPosition方法获取到的全局点的坐标,并不是直接就到了你的目标位置点,而是通过网格计算出来的,该方法获取到的全局坐标,是你当前角色所位于的网格内的坐标。
这句话大家可能并不是很理解,简单来说,这个坐标,无法脱离你的网格,最远,就只能到你的网格的边界了。
下面放出三张图,来帮助大家理解一下:
在这里插入图片描述
如上图所示,这是我们创建的导航区域,也就是角色可以移动的区域,仔细观察你会发现,他并不是一整块的,而是由一个一个相邻的网格组成。设定目标位置后,程序会计算到目标位置需要经过哪一些网格。

如下图所示,红点是我们此时的目标位置,灰色小人是GetNextPathPosition方法返回给我们的位置。

当目标位置不在当前网格的时候,他返回的全局坐标是当前网格内离下一个目标点最近的某一点的坐标,也就是网格最边界的某点。注意,这里我说的是下一个目标点,而不是最终目标点,程序会根据导航网格来计算需要经过哪些网格,这其中涉及寻路算法。
在这里插入图片描述
如下图所示,当目标点位于当前网格内部,则会直接返回目标点的全局位置。
在这里插入图片描述

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

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

相关文章

ICML2021 | RSD: 一种基于几何距离的可迁移回归表征学习方法

目录 引言动机分析主角&#xff08;Principal Angle&#xff09;表征子空间距离正交基错配惩罚可迁移表征学习实验数据集介绍 实验结果总结与展望 论文链接 相关代码已经开源 引言 深度学习的成功依赖大规模的标记数据&#xff0c;然而人工标注数据的代价巨大。域自适应&…

【iOS】使用单例封装通过AFNetworking实现的网络请求

这里写目录标题 前言单例封装网络请求1. 首先创建一个继承于NSObject的单例类&#xff0c;笔者这里以Manager对单例类进行命名&#xff0c;然后声明并实现单例类的初始化方法2.实现完单例的创建方法后我们即可通过AFNetworking中的GET方法进行网络请求3.在Controller文件中创建…

Android12之DRM架构(一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

Docker是一个流行的容器化平台,用于构建、部署和运行应用程序。

文章目录 Web应用程序数据库服务器微服务应用开发环境持续集成和持续部署 (CI/CD)应用程序依赖项云原生应用程序研究和教育 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 ✨收录专栏&#xff1a;…

移动App安全检测的必要性,app安全测试报告的编写注意事项

随着移动互联网的迅猛发展&#xff0c;移动App已经成为人们日常生活中不可或缺的一部分。然而&#xff0c;虽然App给我们带来了便利和乐趣&#xff0c;但也伴随着一些潜在的安全风险。黑客、病毒、恶意软件等威胁着用户的隐私和财产安全&#xff0c;因此进行安全检测就显得尤为…

【广州华锐互动】利用AR进行野外地质调查学习,培养学生实践能力

在科技发展的驱动下&#xff0c;AR&#xff08;增强现实&#xff09;技术已经在许多领域中找到了应用&#xff0c;包括医疗、教育、建筑和娱乐等。然而&#xff0c;有一个领域尚未充分利用AR技术的潜力&#xff0c;那就是野外地质调查。通过将AR技术引入到这个传统上需要大量人…

CUDA编程入门系列(一) 什么是GPU运算?

一、GPU架构 下图为Tesla C2050的GPU架构&#xff0c;其核心由16个组所构成&#xff0c;其中红色方框为单个组的示例&#xff0c;称为SM(Stream Multiprocessor), 每个SM里面又有32个SP&#xff08;Stream Processor&#xff09;&#xff08;即小绿快&#xff09; 下图为Fermi的…

01认识微服务

一、微服务架构演变 1.单体架构 将所有的功能集中在一个项目开发&#xff0c;打成一个包部署。优点架构简单&#xff0c;部署成本低。缺点耦合度高&#xff0c;不利于大型项目的开发和维护 2.分布式架构 根据业务功能对系统进行拆分&#xff0c;每个业务模块作为独立的项目…

核酸管外观缺陷检测(二)

1.1应用示例思路 (1)创建分类器&#xff1b; (2)向分类器中添加样本&#xff1b; (3)训练分类器&#xff1b; (4) 测试数据&#xff0c;并将检测结果写入txt文件中。 1.2 应用示例相关算子介绍 (1) create_class_mlp( : : NumInput, NumHidden, NumOutput, OutputFunctio…

Flow深入浅出系列之在ViewModels中使用Kotlin Flows

Flow深入浅出系列之在ViewModels中使用Kotlin FlowsFlow深入浅出系列之更聪明的分享 Kotlin FlowsFlow深入浅出系列之使用Kotlin Flow自动刷新Android数据的策略 Flow深入浅出系列之在ViewModels中使用Kotlin Flows Flow出现后&#xff0c;LiveData仍然可以用&#xff0c;并且…

进阶JAVA篇-异常处理:解读与解决编程中的意外情况

目录 1.0 什么是异常&#xff1f; 1.1 异常主要分为两个情况分别是运行时异常、编译时异常。 2.0 怎么处理异常呢&#xff1f; 2.1 捕获异常&#xff08;Catch Exception&#xff09; 2.2 声明异常&#xff08;Declare Exception&#xff09; 3.0 自定义异常 3.1 如何定义异常类…

第60节——使用redux-toolkit实战一个商品列表的增删查改

一、样例 二、需求 调用goods.js这个单例完成对goods数据的增删查改 class Goods {constructor() {const data localStorage.getItem("qf-goods-data");this.goods data ? JSON.parse(data) : [];}time 500;/*** 获取商品* returns*/getGoods() {return new Pr…