Godot2D角色导航-自动寻路教程(Godot设置导航代理的目标位置)

news2025/2/1 4:47:59

文章目录

  • 创建导航
  • NavigationAgent2D节点
  • 设置目标位置
  • 其他文章

创建导航

首先,创建一个基本的场景,下面的文章讲解了如何创建一个基本的导航场景,点击如下链接前往该文章:
Godot2D角色导航-自动寻路教程

NavigationAgent2D节点

创建场景之后,我们就来讲一讲NavigationAgent2D这个节点。该节点用于2D的导航代理,它将寻路至某个位置,并且在寻路的过程中能够躲避障碍物,这个障碍物包括静态障碍物和动态障碍物。
躲避动态障碍物使用的是 RVO 防撞算法。
我们可以通过如下代码来获取节点,节点的路径要如实填写,也就是GetNode的参数。

private NavigationAgent2D navigationAgent;

navigationAgent = GetNode<NavigationAgent2D>("NavigationAgent2D");

设置目标位置

使用代理,那我们就需要告诉他一个目标位置,然后让它告诉我们移动到那个位置的路径,这个位置我们可以通过设置TargetPosition属性来告诉我们的NavigationAgent2D节点。当TargetPosition属性被设置为一个特定的2D坐标时,导航代理会自动计算并选择路径,以选择尽可能快地路径移动到这个目标位置。

一旦TargetPosition被设置,会向 NavigationServer 请求一条新的从当前代理位置到TargetPosition的导航路径。然后,我们可以通过这个路径,使该节点沿着路径移动,以达到指定的目标位置。

该属性接收一个Vector2类型的值,我们可以为其赋值,代码如下所示:

navigationAgent.TargetPosition=new Vector2(500.0f, 200.0f);

这样或许有些麻烦,因为我们需要打节点名,再打属性名,我们可以使用属性来对其进行一次封装,如下所示:

	public Vector2 MovementTarget
	{
		get { return navigationAgent.TargetPosition; }
		set { navigationAgent.TargetPosition = value; }
	}

需要注意的是,之前我们说过了,TargetPosition被设置后,会向 NavigationServer 请求一条新的从当前代理位置到TargetPosition的导航路径。而只有在第一帧物理模拟,NavigationServer才可以进行同步,而在第一帧物理模拟之前,导航服务器是无法正常同步的。

这意味着,我们如果直接在_Ready()方法中设置,是会导致错误的,因为_Ready方法会在物理模拟之前执行。此时导航服务器尚未初始化。导航服务器需要先完成初始化和同步,才能够有效地进行导航操作。

所以,我们使用异步等待的方法,来等待第一帧物理模拟,以便导航服务器可以同步。

我们通过使用 async 关键字来声明异步方法。异步方法可以在执行耗时操作时,使程序能够在此期间继续执行其他工作,而不会阻塞线程。这表示我们可以在异步方法内部编写一些长时间运行的操作或需要等待的异步操作。比如说,我们一直等待,直到第一帧物理模拟,然后再为TargetPosition赋值。具体代码如下所示:

	private async void ActorSetup()
	{
		// 等待第一帧物理模拟,以便导航服务器可以同步。
		await ToSignal(GetTree(), SceneTree.SignalName.PhysicsFrame);
		// 现在导航网格不再为空,可以设置移动目标。
		MovementTarget = _movementTargetPosition;
	}

在 ActorSetup() 方法中,我们使用了 await 关键字来等待第一帧物理模拟开始的型号。这意味着代码会暂停执行,直到接收到 PhysicsFrame 信号后才会继续执行下面的代码。

ToSignal 方法,该方法用于监听指定节点的信号。它返回一个 SignalAwaiter对象,配置完成时为指定的节点发出了指定的信号。
ToSignal 方法的参数有两个:

  • source:要监听信号的节点对象。
  • signal:要监听的信号的名称。

而GetTree方法,会返回包含此节点的 SceneTree。

然后我们调用该方法,代码如下所示:

Callable.From(ActorSetup).CallDeferred();

首先,通过使用 Callable.From() 方法,将方法 ActorSetup 转换为一个可调用对象。

接下来,使用 CallDeferred 方法对可调用对象进行延迟调用。延迟调用意味着该方法将在空闲帧期间调用,而不会立即执行。延迟调用的作用是将方法推迟到稍后的时间点执行,以便其他任务有机会执行。CallDeferred 方法可以接收参数,这些参数应与方法的参数列表相匹配。在调用时,传递的参数将作为对应方法的实际参数进行使用。
在这里插入图片描述

另外,我们设置了目标位置后,还需要做其他的工作,这就与Unity有所不同,Unity设置好目标后,就可以自动的向着目标点移动,而在Godot中,我们需要在代码中,自动编写移动逻辑,设置了目标点后,只是让引擎来帮你计算到目标点的路径而已,并不帮你移动。移动代码,我们要自己做。

其他文章

关于信号的讲解可以查看如下文章:

Godot信号教程(使用C#语言)

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

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

相关文章

淘宝店铺所有商品数据接口,淘宝整店所有商品数据接口,淘宝店铺商品接口,淘宝API接口

淘宝店铺所有商品数据接口可以通过淘宝开放平台获取。以下是具体步骤&#xff1a; 在开放平台注册成为开发者并创建一个应用&#xff0c;获取到所需的 App Key 和 App Secret 等信息。使用获取到的 App Key 和 App Secret 进行签名和认证&#xff0c;获取 Access Token。调用开…

【java学习—七】方法的重写(31)

文章目录 1. 相关概念2. 代码中理解4. 子类访问父类的修饰符权限说明 1. 相关概念 定义&#xff1a; 在子类中可以根据需要对从父类中继承来的方法进行改造&#xff0c;也称方法的重置、覆盖。在程序执行时&#xff0c;子类的方法将覆盖父类的方法。要求&#xff1a; &#xf…

机器学习笔记 - 车道检测的几种深度学习方法

一、简述 人们在打造自动驾驶汽车时首先想到的就是实现车道检测。这是 Tesla 和 mobileye 所说的“强制性”任务,也是 Sebastian Thrun(自动驾驶汽车教父)在接受采访时所说的首要任务。 这个方向有很多传统的 OpenCV 算法,这些算法由不再使用的非常旧的函数组成。目前全部都…

protobuf 插件(option)使用

protobuf的option使用 一、需求 来源于工作中的一个需求&#xff1a;在传递message时需要对message中不同的字段进行不同的处理&#xff0c;而处理方式通过注释标注在了每个字段的定义后。 类似于有下面这样一个消息&#xff1a; 其中字段1是始终需要的&#xff0c;字段2和3…

计算机网络:静态路由的应用场景及配置

章节&#xff1a;静态路由&#xff08;部分内容参考&#xff1a;《华为HCIA-Datacom认证学习指南》&#xff09; 《华为 HCIA-Datacom认证学习指南》 目录 一、静态路由应用场景 二、静态路由配置 2.1 实验目的 2.2 实验拓扑 2.3 实验步骤 1.配置网络连通性 2.测试网络…

双节前把我的网站重构了一遍

赶在中秋国庆假期前&#xff0c;终于将我的网站&#xff08;https://spacexcode.com/[1]&#xff09;结构定好了&#xff0c;如之前所说&#xff0c;这个网站的定位就是作为自己的前端知识沉淀。内容大致从&#xff1a;前端涉及的基础知识分类汇总&#xff08;知识库&#xff0…

kafka 相关概念

1 kafka 生产者 kafka 用push的方式把消息推送到topic 每个topic下可以有多个分区&#xff0c; 可以用hash 也可以用轮询的方式指定分区 每个分区内部是可以保证顺序的&#xff0c;但是整体无法保证顺序&#xff0c;除非设置成一个topic只有一个分区。 kafka这种多分区的设置 带…

Elasticsearch 8.11 中的合并更少,摄取更快

作者&#xff1a;ADRIEN GRAND Elasticsearch 8.11 改进了管理索引缓存的方式&#xff0c;从而减少了段合并。 我们对 Elasticsearch 8.11 从索引缓存回收内存的方式进行了重大更改&#xff0c;这有助于减少合并开销&#xff0c;从而加快索引速度。 使用我们的日志跟踪&#x…

嵌入式学习笔记(56)LCD的接口技术

12.2.1从电平角度讲本质上都是TTL信号 (1)什么是TTL接口。5V表示逻辑1&#xff0c;0V表示逻辑0。这种就叫TTL电平&#xff0c;和CMOS电平相对比。 (2)SoC的LCD控制器硬件接口是TTL电平的&#xff0c;LCD这边硬件接口也是TTL电平的。所以他们俩本来是可以直接对接的&#xff0…

我测试用的mark down教程

Markdown 教程 欢迎使用 Markdown 你好,Markdown是一种类似 Word 的排版工具,你需要仔细阅读这篇文章,了解一下 Markdown 基础知识。 Markdown 功能和列表演示 Markdown 有以下功能,帮助你用它写博客: 数学公式代码高亮导航功能等等Markdown 的优点: 间接高效大厂支持…

供应链 | MSOM论文解读:零售商响应定价能力对供应链韧性的影响

​ 论文解读&#xff1a;温梓曦&#xff0c;肖善&#xff0c;杨子豪&#xff0c;张怡雯 A Responsive-Pricing Retailer Sourcing from Competing Suppliers Facing Disruptions 原文作者信息&#xff1a; Xi Shan, Tao Li, Suresh P. Sethi (2021) A Responsive-Pricing Ret…

邮箱发送验证码(nodemailer)

邮箱发送验证码&#xff08;nodemailer&#xff09; 前言&#xff1a;后端实现1、前期准备2、安装nodemailer3、代码实现4、效果图 前言&#xff1a; 想要实现向邮箱发送验证码功能&#xff0c;先来简单地梳理一下思路&#xff1a; 前端用正则表达式简单验证下邮箱格式的正确性…

springboot+vue+java付费自习室选座系统nl1u1

本系统从用户的角度出发&#xff0c;结合当前的环境而开发的&#xff0c;在开发语言上是使用的Java语言&#xff0c;在框架上我们是使用的springboot框架&#xff0c;数据库方面使用的是MySQL数据库&#xff0c;开发工具为IDEA。 付费自习室管理系统根据实际情况分为前后台两部…

ROS键盘遥控机器人,通过参数服务器指定速度

1、引言 在上节的驱动机器人&#xff0c;我们知道是cmd_vel话题发布一串Twist类型消息来控制&#xff0c;我们可以输入如下命令查看这个Twist的详细信息&#xff1a;rosmsg show geometry_msgs/Twist geometry_msgs/Vector3 linear float64 x float64 y float64 z geome…

Linux 编写一个 简单进度条

进度条 回车换行理解&#xff1a; 我们要理解&#xff0c;回车换行是两个概念&#xff1a; 换行是把光标移到下一行&#xff0c;是竖直的往下平移&#xff1b;" \n "回车是把光标移到当前行的最开始&#xff1b; " \r " 就和一起打字…

[计算机提升] Windows系统权限

1.2 Windows系统权限 在Windows操作系统中&#xff0c;权限是指授予用户或用户组对系统资源进行操作的权利。权限控制是操作系统中重要的安全机制&#xff0c;通过权限控制可以限制用户对系统资源的访问和操作&#xff0c;从而保护系统安全。 Windows操作系统中包含以下几种权…

FPGA设计时序约束五、设置时钟不分析路径

一、背景 在进行时序分析时&#xff0c;工具默认对所有的时序路径进行分析&#xff0c;在实际的设计中&#xff0c;存在一些路径不属于逻辑功能的&#xff0c;或者不需要进行时序分析的路径&#xff0c;使用set_false_path对该路径进行约束&#xff0c;时序分析时工具将会直接忽…

通过onnxruntime进行模型部署过程中的问题

1.onnxruntime包 从https://github.com/microsoft/onnxruntime/releases/下载解压到D:/code/package/onnruntime 2opencv_c下载https://github.com/opencv/opencv/releases/tag/4.8.1 3.测试opencv代码&#xff1a;总结&#xff1a;添加include目录&#xff0c;添加lib库目录…

网工配置命令总结(1)---Web访问及vlan配置

目录 1.Telnet远程登录设备 2.用户通过Web网管登录设备 3.端口隔离功能的实现 4.配置vlan聚合 5.部分vlan间互通&#xff0c;部分vlan间隔离&#xff0c;vlan内用户隔离 6.限制内网网段互访 1.Telnet远程登录设备 1.使能服务器功能 <HUAWEI> system-view [HUAWEI] …

Eslint配置 Must use import to load ES Module(已解决)

最近在配置前端项目时&#xff0c;eslint经常会碰到各种报错&#xff08;灰常头疼~&#xff09; Syntax Error Error No ESLint configuration found.Syntax Error: Error: D:\dmq\dmq-ui.eslintrc.js: Environment key “es2021” is unknown at Array.forEach ()error in ./…