【Studio】新的寻路修饰符--Studio 测试版

AI 开发者们,大家好:

目前,PathfindingService 几乎总是只返回原点和目标点之间最短的路径。然而,最佳的路径往往应该考虑角色/行为主体的能力、地形类型和游戏规则。

例如:你可能想让 NPC 用桥过河,而不是在水中游泳、走人行道过马路,或者避开一个会伤害角色的区域。

PathfindingModifiers 简介

PathfindingModifiers 是用于注释/修改部件或网格部件的实例。它们的目的是让游戏开发者自定义穿越其父级定义的体积的成本。为此,CreatePath() 现在还包括一个参数 Costs(成本),用于将 PathfindingModifier.ModifierId 映射到成本倍数因子上。例如,一个 100.0 的成本值意味着父部件的穿越难度为 100.0 倍。相反,一个 0.5 的成本值会让体积被包括在最终路径中的可能性增加一倍。

让我们来回顾一下这个功能的一些实际使用案例。

1.行为主体可以跨过禁区吗?

当游戏中存在死亡禁区时,编写 NPC 的 AI 时,应该让 PathfindingService 知道行为主体想避开它们,而不是径直走过。用一个 PathfindingModifier 实例来注释这个部件,可以让我们自定义生成的路径,就像这样:

1

local modifier = Instance.new("PathfindingModifier")
modifier.ModifierId = "DeathBrick"
modifier.Parent = deathBrickPart
 
local agentParameters = {
    AgentRadius = 2,
    AgentCanJump = True,
    Costs = {
        DeathBrick = 10.0
    }
}
local path = PathfindingService:CreatePath(agentParameters)
path:ComputeAsync()

新的 Costs(成本)参数将标识符映射到成本乘数因子,在路径搜索过程中用于确定穿越该区域的优先级。常数 math.huge 可以用来表示应该完全避开该区域,即使它是唯一可用的路径。

2.不要横穿马路!

假设我们正在做一个城市模拟游戏,街上的行人会尽可能地使用人行横道。将街道模型分割成人行横道/非人行横道可能并不实际。为了能够注释任意区域,PathfindingModifiers 可以被用作体积的父项。体积通常是不可碰撞、锚定且透明的部件,用于建立游戏区域。因此,修饰符将注释任何与它重叠的世界几何体。

使用下面的代码,你可以放置一个不可见的部件,指示地图上人行横道的位置。
2

local modifierVolume = Instance.new("Part", workspace)
modifierVolume.CanCollide = false
modifierVolume.Anchored = true
modifierVolume.Transparency = 1.0
modifierVolume.Position = ...
modifierVolume.Size = ...
 
local modifier = Instance.new("PathfindingModifier", modifierVolume)
modifier.ModifierId = "Crosswalk"
 
local agentParameters = {
    Costs = {
        Crosswalk = 0.01
    }
}

3.菜鸟不会游泳!

PathfindingService 会自动用部件和地形材质来注释区域。
在下面的例子中,我们将一个数值较高的成本乘法器赋予流水。这样当旁边有一座桥作为可选路径时,NPC 就会被引导去走桥。

乘数因子的数值设置没有固定的规则——您需要对它进行调整,直到达到你想要的效果。离桥的距离和需要穿过的水量都将在权衡最终路径时被考虑进去。

local agentParameters = {
    Costs = {
        Water = 100.0
    }
}

3

4.开门

PathfindingService 默认将所有的障碍物视为拥有相同的“成本”。该服务不知道如何区分一堵砖墙和一扇未上锁的门。使用 PathfindingModifiers 可以为诸如门之类的入口设置一个优先级。

下面的例子启用了修饰符中的 PassThrough 属性,表示它所包围的所有障碍物都是可以穿越的(在这个例子中即可以打开的门)。

doorVolume.PathfindingModifier.ModifierId = "Door"
doorVolume.PathfindingModifier.PassThrough = true
 
local canCrossDoor = true or false
local agentParameters = {
    Costs = {
        Door = canCrossDoor and 1.0 or math.huge
    }
}

4

如何启用 PathfindingModifiers

你需要先启用测试版功能。

要启用测试版功能:

调试可视化

可以看到服务使用了哪些注释。当模型和地形重叠,不清楚行为主体会看到什么时,这特别有用。

要启用它,请打开 Studio 设置并启用以下设置:
6

常见问题

处理普通部件、地形和带有修饰符的部件的优先级是什么?

  • 优先级是:寻路修饰符→部件材质→地形材质

如果几个部件/体积相互重叠怎么办?

  • 我们建议你尽可能地避免这种情况,其结果不可预测

已知的问题

  • 靠近地形表面的部件有时会识别地形材质,而不是位于其上方的部件(正在修复中)

我们希望听到你的反馈

我们很高兴能为你提供这个测试版。若你有任何想法,或是对这些功能有特别的使用技巧,请大声告诉我们。

特别感谢 @Cinderstock 对此功能的工程支援。

关于我们    加入我们    条款    隐私政策
©2021 Roblox Corporation、Roblox、Roblox 标志及 Powering Imagination 是我们在美国及其他国家或地区的注册与未注册商标。
粤ICP备20013629号