Roblox Studio · 第 23 课

NPC 巡逻:让机器人走完路线

用 Rig、Humanoid:MoveTo() 和 MoveToFinished,制作能报告失败的巡逻机器人。

10–15 岁 75 分钟 NPC / MoveTo 动手实践 测试与保存

Course overview

让营地机器人走到三个路标,并知道自己有没有到达。

NPC 是不由真实玩家直接操作的角色。你可以给它一条巡逻路线,让它逐个走到指定位置。

这一课先做没有墙的路线。Humanoid:MoveTo() 会要求角色走向目标,但不会自动为复杂迷宫规划绕路。下一课才加入自动寻路。

01 · BEFORE

开始之前

理解 Humanoid、数组和循环。新建 Lesson23,保持地面宽阔平整。

02 · MAKE

你的作品

一个依次走向 Point1、Point2、Point3 的机器人,遇到失败会停止并报告。

03 · CHECK

完成标志

空地上能走完;被墙挡住时不会假装成功;路线顺序明确。

官方路径练习中起点和终点的场景截图
图 23-1:官方起点与终点场景参考:先做无遮挡的短路线,再让 NPC 依次移动;这不是本课巡逻结果。Roblox Creator Documentation · CC BY 4.0 · 原图未修改 · 许可说明

Learning route

先准备,再动手;看到结果后,记得保存。

每完成一小步,就测试一次。先说出你预计会看到什么,再用 Play 和 Output 检查,不用急着一次写完所有代码。

1

01 · 使用内置 Rig 创建机器人

从 Studio 的角色工具中打开 Rig Builder,插入一个基础 R15 Rig,命名 PatrolBot。不同界面版本可能把工具放在 Avatar 或角色相关栏中,按 Rig Builder 名称寻找。

2

02 · 数组顺序就是巡逻顺序

不要依赖 GetChildren 返回的顺序恰好等于名称顺序。这里明确列出 Point1、Point2、Point3,让路线可预测。

3

03 · 等待抵达,再走下一站

MoveTo 发出移动请求后不会等到抵达才返回。MoveToFinished:Wait() 则等待结果,并告诉你是否到达。

4

04 · 让服务器负责这个 NPC 的物理

SetNetworkOwner(nil) 把这个未锚定角色装配体的网络物理控制交给服务器,有助于课堂中稳定观察同一个 NPC。它不会替你修复错误的关节或锚定设置。

5

05 · 故意挡住一次路线

在第一段路中放一堵宽墙,观察机器人是否停下并报告失败。不要期待 MoveTo 自己规划一条复杂绕路。

Step by step

01 · 使用内置 Rig 创建机器人

从 Studio 的角色工具中打开 Rig Builder,插入一个基础 R15 Rig,命名 PatrolBot。不同界面版本可能把工具放在 Avatar 或角色相关栏中,按 Rig Builder 名称寻找。

模型里需要 Humanoid 与 HumanoidRootPart。不要把机器人所有零件 Anchored,否则 Humanoid 无法驱动它行走。

  1. 将 PatrolBot 放在宽阔地面上,确认所有角色身体零件未 Anchored。
  2. 在 Workspace 建立三个 Anchored 的 Part:Point1、Point2、Point3,分别放在 0,0.5,-10;12,0.5,-10;12,0.5,2。
  3. 路标 Size=3,1,3、CanCollide=false。
  4. 在 ServerScriptService 创建 Patrol。
NPC 的 Humanoid 属性区域参考
图 23-2:官方 Humanoid 属性参考:NPC 也需要 Humanoid;有 Humanoid 并不意味着这个 Model 是玩家。Roblox Creator Documentation · CC BY 4.0 · 原图未修改 · 许可说明

Step by step

02 · 数组顺序就是巡逻顺序

不要依赖 GetChildren 返回的顺序恰好等于名称顺序。这里明确列出 Point1、Point2、Point3,让路线可预测。

WalkSpeed 设为 8,机器人走慢一点,你就有时间观察。场景物体太远或走不到时,MoveToFinished 可能报告 false。

  1. 检查三个路标都在 Workspace 直接下面。
  2. 把机器人放在起点附近,不要一开始就贴着墙或悬空。

Step by step

03 · 等待抵达,再走下一站

MoveTo 发出移动请求后不会等到抵达才返回。MoveToFinished:Wait() 则等待结果,并告诉你是否到达。

本课只巡逻一轮。失败就 return,Output 会指出是哪一站,不会无限追着一个不可能到达的位置跑。

  1. 将完整脚本放入 Patrol。
  2. Play 后观察机器人走完三站。
  3. 检查 Output 最后显示 Patrol complete。
ServerScriptService > Patrol · 完整脚本Luau
local bot = workspace:WaitForChild("PatrolBot")
local humanoid = bot:WaitForChild("Humanoid")
local root = bot:WaitForChild("HumanoidRootPart")
root:SetNetworkOwner(nil)
humanoid.WalkSpeed = 8
local route = {
    workspace:WaitForChild("Point1"),
    workspace:WaitForChild("Point2"),
    workspace:WaitForChild("Point3"),
}

for index, point in ipairs(route) do
    if humanoid.Health <= 0 then return end
    print("Moving to", index, point.Name)
    humanoid:MoveTo(point.Position)
    local reached = humanoid.MoveToFinished:Wait()
    if not reached then
        warn("Could not reach " .. point.Name)
        return
    end
end
print("Patrol complete")

Step by step

04 · 让服务器负责这个 NPC 的物理

SetNetworkOwner(nil) 把这个未锚定角色装配体的网络物理控制交给服务器,有助于课堂中稳定观察同一个 NPC。它不会替你修复错误的关节或锚定设置。

基础 Rig 可能像滑行一样移动,因为走路动画还没配置。本课检查的是位置与抵达结果,不把动画缺失误认为 MoveTo 失败。

  1. 如果机器人不动,先查 Anchored 和地面碰撞。
  2. 如果 SetNetworkOwner 报错,检查 HumanoidRootPart 是否属于未锚定的角色装配体。
  3. 将动画表现记为后续美术任务,先完成移动逻辑。

Step by step

05 · 故意挡住一次路线

在第一段路中放一堵宽墙,观察机器人是否停下并报告失败。不要期待 MoveTo 自己规划一条复杂绕路。

这个失败案例会成为第 24 课的起点。先保存一份空地上能成功的版本,再保存有墙的测试副本。

  1. 空地:应按顺序到达三站。
  2. 有墙:可能超时返回 false,不能打印最终成功。
  3. 移开墙再运行,应恢复正常。

Homework

轮到你来改一改,做出自己的版本。

1 营地巡逻线

让三个路标围成一个小三角形,保持可直接行走。

2 失败记录

保存一条无法抵达时的 Output 消息,并写出原因。

3 选做:第四站回家

把起点加为第四个路标,让机器人一轮结束后回到营地。

完成标准:先在 Playtest 中验证作品,再点击 Stop,保存为“姓名缩写_Lesson23”或对应 Homework 副本;不要覆盖上一课的可运行版本。

Exit questions

先自己回答,再展开看看。

MoveTo 会等角色到达才返回吗?

不会,需要通过 MoveToFinished 等待结果。

基础 Rig 没走路动画代表不能移动吗?

不代表,位移与动画是不同系统。

为什么不把身体 Anchored?

Humanoid 需要能够运动的角色装配体。

MoveTo 能自动解决复杂绕路吗?

不能保证,复杂路径需要 PathfindingService 等规划方式。

Explore further

需要查资料时,从这里出发。

正文代码可以直接复制。先确认脚本类型、放置位置,以及这段代码是完整版本还是小实验;不要把同一脚本的多个版本叠加运行。界面参考图已标注来源,图中的对象名可能与本课不同,请以操作步骤为准。