牡丹江百姓网免费发布信息,seo国外推广软件,直播开放平台抖音,公司展厅布置效果图文章目录 创建导航NavigationAgent2D节点设置目标位置其他文章 创建导航
首先#xff0c;创建一个基本的场景#xff0c;下面的文章讲解了如何创建一个基本的导航场景#xff0c;点击如下链接前往该文章#xff1a; Godot2D角色导航-自动寻路教程
NavigationAgent2D节点 … 文章目录 创建导航NavigationAgent2D节点设置目标位置其他文章 创建导航
首先创建一个基本的场景下面的文章讲解了如何创建一个基本的导航场景点击如下链接前往该文章 Godot2D角色导航-自动寻路教程
NavigationAgent2D节点
创建场景之后我们就来讲一讲NavigationAgent2D这个节点。该节点用于2D的导航代理它将寻路至某个位置并且在寻路的过程中能够躲避障碍物这个障碍物包括静态障碍物和动态障碍物。 躲避动态障碍物使用的是 RVO 防撞算法。 我们可以通过如下代码来获取节点节点的路径要如实填写也就是GetNode的参数。
private NavigationAgent2D navigationAgent;navigationAgent GetNodeNavigationAgent2D(NavigationAgent2D);设置目标位置
使用代理那我们就需要告诉他一个目标位置然后让它告诉我们移动到那个位置的路径这个位置我们可以通过设置TargetPosition属性来告诉我们的NavigationAgent2D节点。当TargetPosition属性被设置为一个特定的2D坐标时导航代理会自动计算并选择路径以选择尽可能快地路径移动到这个目标位置。
一旦TargetPosition被设置会向 NavigationServer 请求一条新的从当前代理位置到TargetPosition的导航路径。然后我们可以通过这个路径使该节点沿着路径移动以达到指定的目标位置。
该属性接收一个Vector2类型的值我们可以为其赋值代码如下所示
navigationAgent.TargetPositionnew 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#语言