【Godot4.2】2D导航03 - NavigationRegion2D及其使用方法

news2025/1/22 16:15:06

概述

Godot4.0改进了2D部分的导航,NavigationRegion2D基本可以看做是3.X的Navigation2D的进化版本。
它的基本用法就是先绘制navigation_polygon,也就是导航网格,或者直白点就是“可通行区域”。然后将带有碰撞形状和NavigationAgent2D子节点的玩家放置到这个可通行区域,然后在_physics_process中判断并移动就可以了。

案例

创建地图

从网上随便找一了一张2D游戏的地形素材。(仅做学习使用)
map.jpg
我们创建一个2D场景,将地形素材拖入场景,根节点下自动创建Sprite2D节点,更名为map,然后继续添加一个NavigationRegion2D节点。
image.pngimage.png
选中NavigationRegion2D节点,为我们导入的地形素材手工绘制可通行区域的多边形。
绘制可通行区域(也就是导航区域)
:::danger
注意

  • 多个闭合多边形虽然可以被画出来,但即便有重合区域,却不被认为是可互相通行的;

因此,最好是一气呵成的绘制。
:::

创建玩家

CharacterBody2D类型创建玩家场景,用工程自带的icon.svg作为玩家样貌(可以适当缩放),添加圆形碰撞形状。
除此之外,添加一个NavigationAgent2D
image.png
为玩家创建如下代码:

# player.gd
extends CharacterBody2D

var move_speed = 200.0

var target_pos:Vector2:
	set(val):
		target_pos = val
		nav.target_position = val

@onready var nav = $NavigationAgent2D

func _physics_process(delta):
	if nav.is_navigation_finished():
		return
	if nav.is_target_reachable():
		var next_pos = nav.get_next_path_position()
		velocity = global_position.direction_to(next_pos) * move_speed
		move_and_slide()

其中:

  • 第6行:定义target_pos变量,并通过Setter函数,传递给NavigationAgent2Dtarget_position属性。
  • _physics_process中我们通过NavigationAgent2Dget_next_path_position()方法获取下一个可以到达的位置,并通过获取当前位置(也就是玩家的global_position)到下一位置的方向乘以移动速度来获取玩家的速度向量,然后执行move_and_slide()进行移动。
  • 当玩家到达指定位置后,NavigationAgent2Dis_navigation_finished()就会变为true,直接return就可以了。
  • 通过is_target_reachable()可以判断,多指定的点是否可以到达。但是设置后,玩家不会尽量像目标位置移动,而是直接不走了。

为world2场景添加Palyer场景实例,并将玩家放置在可通行区域内。
image.png
为world2场景根节点添加如下代码:

# world2.gd
extends Node2D

@onready var player = $Player

func _input(event):
	if event is InputEventMouseButton:
		if event.button_index == MOUSE_BUTTON_LEFT and event.is_pressed():
			player.target_pos = get_global_mouse_position()

其核心是通过鼠标左键点击,将鼠标的全局位置传递给player的target_pos属性,也就是间接的传递给PlayerNavigationAgent2Dtarget_position属性。

运行效果

运行后的效果如下:
基于NavigationRegion2D的寻路.mp4 (29.04MB)## 总结
可以看到,这种导航形式非常简单,通过在地图上绘制可通行区域,在角色身上添加导航代理,然后将想要到达的位置传递给导航代理,再在物理帧处理函数中不断地获取下一个位置,并动态计算速度向量,然后move_and_slide()的就可以了。

参考

  • 【Godot 4】2D寻路教程-2D Pathfinding Tutorial_哔哩哔哩_bilibili

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

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

相关文章

蓝桥杯前端Web赛道-输入搜索联想

蓝桥杯前端Web赛道-输入搜索联想 题目链接:1.输入搜索联想 - 蓝桥云课 (lanqiao.cn) 题目要求: 题目中还包含effect.gif 更详细的说明了需求 那么观察这道题需要做两件事情 把表头的每一个字母进行大写进行模糊查询 这里我们会用到几个js函数&#…

如何用VR全景讲述产品、企业的故事

请记住,你的全景不只是全景!使用VR全景来讲述企业或产品的故事是一种创新且互动性强的方法,可以吸引观众并提供沉浸式体验。 运用720云漫游编辑工具的导览功能和数字人功能,您可以创造一个既视觉吸引又能情感连结的故事。 1. 规划…

OpenCV学习笔记(十)——利用腐蚀和膨胀进行梯度计算以及礼帽和黑帽

梯度计算 在OpenCV中,梯度计算是图像处理中的一个基本操作,用于分析图像中像素值的变化速率的方向,其中梯度的方向是函数变化最快的方向,因此在图像中,沿着梯度方向可以找到灰度值变化最大的区域,这通常是…

golang面试题总结

零、go与其他语言 0、什么是面向对象 在了解 Go 语言是不是面向对象(简称:OOP) 之前,我们必须先知道 OOP 是啥,得先给他 “下定义” 根据 Wikipedia 的定义,我们梳理出 OOP 的几个基本认知: …

Springboot+Redis:实现缓存 减少对数据库的压力

🎉🎉欢迎光临,终于等到你啦🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟持续更新的专栏Redis实战与进阶 本专栏讲解Redis从原理到实践 …

期权波动率是什么?怎么计算?

期权波动率 历史波动率:基于历史行情计算出来的历史波动率 我们现在站在现实时点B回顾过去,从A到B这段时间的历史行情我们是知道的,但是基于过去一段时间,标的价格的历史数据计算出来的波动率,就是历史波动率&#x…

c++类和对象(中)类的6个默认成员函数及const成员函数

🪐🪐🪐欢迎来到程序员餐厅💫💫💫 今日主菜:类和对象 主厨:邪王真眼 所属专栏:c专栏 主厨的主页:Chef‘s blog 前言: 咱们之前也是…

字符分类函数

字符分类函数 文章目录 前言1. 字符分类函数1.2.使用例子 2.2.字符操作函数 前言 在编程的过程中,我们经常要处理字符和字符串,为了⽅便操作字符和字符串,C语⾔标准库中提供了⼀系列库函数,接下来我们就学习⼀下这些函数。 1. 字…

搭建项目后台系统基础架构

任务描述 1、了解搭建民航后端框架 2、使用IDEA创建基于SpringBoot、MyBatis、MySQL、Redis的Java项目 3、以原项目为参照搭建项目所涉及到的各个业务和底层服务 4、以原项目为例,具体介绍各个目录情况并参照创建相关文件夹 1、创建项目后端 BigData-KongGuan …

Linux发布项目(包括前端和后端)到OpenEuler虚拟机上

后端:SpringBoot 前端:VUE3 操作系统:Linux 虚拟机:OpenEuler 发布项目是需要关闭虚拟机上的防火墙 systemctl stop firewalld 一、发布后端项目到虚拟机 1打包后端项目为jar包 2将打包后的jar包放到虚拟机 /opt 目录下 3 运行项…

接口自动化测试流程、工具及实践(完整版)

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、接口自动化测试简介 接口自动化测试是指通过编写脚本或使用自动化工具,对软件系…

小朋友排队(蓝桥杯,acwing,归并)

题目描述: n 个小朋友站成一排。 现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友。 每个小朋友都有一个不高兴的程度。 开始的时候,所有小朋友的不高兴程度都是 0。 如果某个小朋友第一次被要求交换&#…

算法之前缀和

题目1: 【模板】一维前缀和(easy) 方法一: 暴力解法, 时间复杂度O(n*q), 当n10^5, q 10^5, 时间复杂度为O(10^10), 会超时. 方法二: 前缀和: 快速求出数组中某一段连续区间的和. 第一步: 预处理出来一个前缀和数组dp: 1. dp[i]表示区间[1,i]里所有元…

“币安悬赏500万美元”,调查BOME内幕!创始人:谁控制了Meme,谁就控制了宇宙!

自去年11月开始,背靠美帝资本力量的Solana在FTX交易所暴雷后重新崛起。目前Sol价格已经从熊市的8美刀上涨至200刀附近。除了Sol本币上涨外,Solana生态也是快速发展。 这其中又以Meme币最为突出!西方玩家正把所有的梗都搬进链上制成Meme币&am…

echarts geo地图加投影两种方法

方法1,geo中加多个地图图形,叠加。缩放时 可能会不一致,需要捕捉georoam事件,使下层的geo随着上层的geo一起缩放拖曳 geo: [{zlevel: 3,//geo显示级别,默认是0 【最顶层图形】map: BJ,//地图名roam: true,scaleLimit: …

[AIGC] MySQL与PostgreSQL:两种流行的数据库系统的对比

数据库是存储和查询数据的重要工具。在选择数据库时,两个经常被考虑的选项都是开源的:MySQL和PostgreSQL。这两个数据库都与许多应用程序一起使用,但它们在某些方面存在显著的不同。在本文中,我们将比较MySQL和PostgreSQL的一些关…

基金分析之与行业间的相关系数计算

这几年买了非常多的基金,一直很好奇基金在非业绩披露期都持有了什么东西?所以写了一个基金净值和各申万一级行业相关系数(以及和市场主流指数)的代码看看能否分析出点东西。 这里依然用了wind API,复现前记得安装。 …

超快速排序(蓝桥杯,归并排序,acwing)

题目描述: 在这个问题中,您必须分析特定的排序算法----超快速排序。 该算法通过交换两个相邻的序列元素来处理 n 个不同整数的序列,直到序列按升序排序。 对于输入序列 9 1 0 5 4,超快速排序生成输出 0 1 4 5 9。 您的任务是确…

JavaScript基础知识2

求数组的最大值案例 let arr[2,6,1,7,400,55,88,100]let maxarr[0]let minarr[0]for(let i1;i<arr.length;i){max<arr[i]?maxarr[i]:maxmin>arr[i]?minarr[i]:min}console.log(最大值是&#xff1a;${max})console.log(最小值是&#xff1a;${min}) 操作数组 修改…

企业专业化管理金字塔:技能进阶与案例分析

在纷繁复杂的企业管理领域中&#xff0c;一套行之有效的管理技能体系对于企业的稳健发展至关重要。本文将深入探讨企业专业化管理金字塔的五个层次&#xff1a;基本的管理技能、业务操作管理技能、组织管理技能、组织开发技能以及管理转变技能&#xff0c;并结合实际案例&#…