如何使用探路者让NPC追逐玩家
How do I use pathfinder to make the NPC chase a player
我已经尝试在 Roblox 开发者论坛中查找多个解决方案,但我只找到了一些未完成的代码或一些不适用于我的代码。这张照片中的代码让我的钻机找到零件并追逐它直到它到达那里。这非常有效,但我一直在努力寻找一种方法让钻机改为追逐最近的玩家。我听说过震级,但我不确定如何实现它,我什至无法让钻机首先追逐玩家。
首先,.magnitude
是“向量的长度”。它主要用于查找从点 A 到点 B 的矢量单位距离。因此,到 2 个点的距离为 (pointA.Position-pointB.Position).magnitude
。
https://developer.roblox.com/en-us/articles/Magnitude
现在为了追逐玩家,你可以遍历所有的玩家,找到你的 NPC 会追逐的玩家。
您可以使用 for 循环并遍历 game.Players:GetPlayers()
,然后获取他们的角色:<v>.Character
,然后是他们的 HumanoidRootPart,其中有他们的位置。如果你想为你的 NPC 或 'aggro distance' 设置一个范围,你可以在这里实现量级。您将首先为您的距离创建一个变量。由于我们将处理向量单位,因此它应该是向量的长度。例如 local aggroDistance = 30
。当添加到代码中时,这意味着它只会跟踪玩家,如果他们在 30 个螺柱内。然后你会写一个 if 语句说 if (<NPC.HumanoidRootPart.Position-<players hrp position>).magnitude < aggroDistance then
。现在您可以使用 Pathfinding Service 将 NPC 移动到玩家,方法是使用 PathfindingService:ComputeAsync(<NPC HumanoidRootPart Position, <player HumanoidRootPart Position>)
:ComputeAsync()
从起始位置(第一个参数)到结束位置(第二个参数)创建一条路径。 <NPC Humanoid>:MoveTo(<player HumanoidRootPart Position>)
然后让NPC移动到玩家身边。为了监听 NPC 何时到达它在 :ComputeAsync()
中创建的路径的末端,你可以在它到达末端后执行 <NPC Humanoid>:MoveToFinished:Connect(function())
到 运行 一个函数,或者 <NPC Humanoid>:MoveToFinished:Wait()
在计算下一条路径之前等待。
提示:您可能还想检查玩家的生命值是否大于 0(如果他们还活着),这样 NPC 只会移动到活着的玩家那里。你可以通过在你有 aggroDistance 的 if 语句中添加一个 and <player>.Humanoid.Health > 0
来做到这一点。
如果您有任何问题,请告诉我。
代码构成:
aggroDistance variable
<可选
while loop
if statement (can contain aggroDistance variable if you have one) and check player health
:ComputeAsync()
:MoveTo()
:MoveToFinished
if statement end
while loop end
我已经尝试在 Roblox 开发者论坛中查找多个解决方案,但我只找到了一些未完成的代码或一些不适用于我的代码。这张照片中的代码让我的钻机找到零件并追逐它直到它到达那里。这非常有效,但我一直在努力寻找一种方法让钻机改为追逐最近的玩家。我听说过震级,但我不确定如何实现它,我什至无法让钻机首先追逐玩家。
首先,.magnitude
是“向量的长度”。它主要用于查找从点 A 到点 B 的矢量单位距离。因此,到 2 个点的距离为 (pointA.Position-pointB.Position).magnitude
。
https://developer.roblox.com/en-us/articles/Magnitude
现在为了追逐玩家,你可以遍历所有的玩家,找到你的 NPC 会追逐的玩家。
您可以使用 for 循环并遍历 game.Players:GetPlayers()
,然后获取他们的角色:<v>.Character
,然后是他们的 HumanoidRootPart,其中有他们的位置。如果你想为你的 NPC 或 'aggro distance' 设置一个范围,你可以在这里实现量级。您将首先为您的距离创建一个变量。由于我们将处理向量单位,因此它应该是向量的长度。例如 local aggroDistance = 30
。当添加到代码中时,这意味着它只会跟踪玩家,如果他们在 30 个螺柱内。然后你会写一个 if 语句说 if (<NPC.HumanoidRootPart.Position-<players hrp position>).magnitude < aggroDistance then
。现在您可以使用 Pathfinding Service 将 NPC 移动到玩家,方法是使用 PathfindingService:ComputeAsync(<NPC HumanoidRootPart Position, <player HumanoidRootPart Position>)
:ComputeAsync()
从起始位置(第一个参数)到结束位置(第二个参数)创建一条路径。 <NPC Humanoid>:MoveTo(<player HumanoidRootPart Position>)
然后让NPC移动到玩家身边。为了监听 NPC 何时到达它在 :ComputeAsync()
中创建的路径的末端,你可以在它到达末端后执行 <NPC Humanoid>:MoveToFinished:Connect(function())
到 运行 一个函数,或者 <NPC Humanoid>:MoveToFinished:Wait()
在计算下一条路径之前等待。
提示:您可能还想检查玩家的生命值是否大于 0(如果他们还活着),这样 NPC 只会移动到活着的玩家那里。你可以通过在你有 aggroDistance 的 if 语句中添加一个 and <player>.Humanoid.Health > 0
来做到这一点。
如果您有任何问题,请告诉我。
代码构成:
aggroDistance variable
<可选
while loop
if statement (can contain aggroDistance variable if you have one) and check player health
:ComputeAsync()
:MoveTo()
:MoveToFinished
if statement end
while loop end