移动/游戏
在 Roblox 中制作 NPC/敌人 AI 时,用寻路…
适用于为 Roblox NPC 或敌人实现寻路、状态机、视野检测、生成与 AI 更新循环的场景。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
在 Roblox 中制作 NPC/敌人 特定
解决思路
- 用 `PathfindingService:CreatePath({ AgentRadius = 2, AgentHeight = 5, AgentCanJump = true, Costs = { Water = 20, DangerZone = math.huge } })` 创建路径,并按 NPC 尺寸与区域代价配置参数。
- 调用 `path:ComputeAsync(npcPos, targetPos)` 计算路径,并在 `path.Status ~= Enum.PathStatus.Success` 时直接返回或放弃本次寻路。
- 遍历 `path:GetWaypoints()`:当 `wp.Action == Enum.PathWaypointAction.Jump` 时设置 `humanoid.Jump = true`;对每个路径点调用 `humanoid:MoveTo(wp.Position)`,并用 `humanoid.MoveToFinished:Wait()` 等待;若未完成则返回或取消。
- 路径被阻挡时重新计算,并设置有限重试次数或取消策略。
- 在 Studio 中上线前用有代表性的地图测试 `Workspace.PathfindingUseImprovedSearch`;该属性不可通过脚本设置。
- 避免长时间寻路请求与反复重算;移动可碰撞几何体可能触发导航网格计算。
- 区域修饰:用 anchored part 加 `PathfindingModifier` Label 映射到 Costs。
- 门使用 `PassThrough = true`;不连通导航网格使用 `PathfindingLink`。
- `math.huge` 代价表示不可通行。
- 实现状态机:`idle → patrol → chase → attack → flee → dead`。
- 状态转移:`idle/patrol → chase`(检测到玩家)→ `attack`(进入范围)→ `idle`(丢失目标)。
- 状态转移:任意状态 → `flee`(生命值低)→ `idle`(安全);任意状态 → `dead`(生命值 ≤ 0)。
- 由状态转移负责移动变更、目标清理和取消操作。
- 检测顺序按距离 → FOV → LOS:先用 `(a-b).Magnitude` 做距离检测,成本最低,永远最先。
- FOV 用 `forward:Dot(toTarget)` 计算余弦;使用为你的游戏配置的视锥角,不要用通用角度。
- LOS 用 `workspace:Raycast`;成本高,最后做。
- 如果设计包含听觉或接近检测,将其作为单独配置的信号,而不是用通用 FOV 绕过。
- 网络所有权:经典项目可对物理敏感的 NPC 使用 `SetNetworkOwner(nil)`,但它不是完整安全措施;在 Server Authority 项目中,应配置权威模型,而不是把网络所有权当安全边界。
- 更新循环:根据 NPC 数量、路径成本和 profiler 证据节流与错峰 AI 更新,不要使用通用 tick rate。
- 将 NPC 决策和移动保留在服务端;客户端代码可以处理表现。
- 对于生成器、生命周期清理、超时处理和性能预算,加载 `references/full.md`。
适用边界 · 注意事项
- 不适用于非 Roblox 项目,或不使用 Roblox Luau 与 Roblox 引擎 API 的场景。
- 如果 NPC 不需要寻路、状态机或视野检测,或只是纯客户端表现型对象,不要套用此 AI 循环。
- 没有服务端权威或性能预算时,不应直接照搬完整 AI 更新循环到大量 NPC。