AI 开发者们,大家好:
目前,PathfindingService 几乎总是只返回原点和目标点之间最短的路径。然而,最佳的路径往往应该考虑角色/行为主体的能力、地形类型和游戏规则。
例如:你可能想让 NPC 用桥过河,而不是在水中游泳、走人行道过马路,或者避开一个会伤害角色的区域。
PathfindingModifiers 简介
PathfindingModifiers 是用于注释/修改部件或网格部件的实例。它们的目的是让游戏开发者自定义穿越其父级定义的体积的成本。为此,CreatePath() 现在还包括一个参数 Costs(成本),用于将 PathfindingModifier.ModifierId 映射到成本倍数因子上。例如,一个 100.0 的成本值意味着父部件的穿越难度为 100.0 倍。相反,一个 0.5 的成本值会让体积被包括在最终路径中的可能性增加一倍。
让我们来回顾一下这个功能的一些实际使用案例。
1.行为主体可以跨过禁区吗?
当游戏中存在死亡禁区时,编写 NPC 的 AI 时,应该让 PathfindingService 知道行为主体想避开它们,而不是径直走过。用一个 PathfindingModifier 实例来注释这个部件,可以让我们自定义生成的路径,就像这样:
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 可以被用作体积的父项。体积通常是不可碰撞、锚定且透明的部件,用于建立游戏区域。因此,修饰符将注释任何与它重叠的世界几何体。
使用下面的代码,你可以放置一个不可见的部件,指示地图上人行横道的位置。
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
}
}
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
}
}
如何启用 PathfindingModifiers
你需要先启用测试版功能。
要启用测试版功能:
-
在 Studio 中点击 File(文件)→ Beta Features(测试版功能)
-
勾选“Pathfinding Modifiers(寻路修饰符)”左边的方框
-
重新启动 Studio
你可以在 DevHub 上阅读更多关于 Pathfinding(寻路)和 Modifiers(修饰符)的信息:
调试可视化
可以看到服务使用了哪些注释。当模型和地形重叠,不清楚行为主体会看到什么时,这特别有用。
要启用它,请打开 Studio 设置并启用以下设置:
常见问题
处理普通部件、地形和带有修饰符的部件的优先级是什么?
- 优先级是:寻路修饰符→部件材质→地形材质
如果几个部件/体积相互重叠怎么办?
- 我们建议你尽可能地避免这种情况,其结果不可预测
已知的问题
- 靠近地形表面的部件有时会识别地形材质,而不是位于其上方的部件(正在修复中)
我们希望听到你的反馈
我们很高兴能为你提供这个测试版。若你有任何想法,或是对这些功能有特别的使用技巧,请大声告诉我们。
特别感谢 @Cinderstock 对此功能的工程支援。