Skip to main content

AI 导航示例

示例世界​

示例世界

Udon 可以使用 AI 导航。此示例展示了如何将其用于寻路和创建在世界中行走的 NPC 角色。

访问 AI 导航示例世界亲自体验!

使用示例​

此场景包含一组 NPC,它们试图从红色方块到达绿色方块。你可以移动蓝色方块为它们搭建路径。Unity 的 AI 导航会在你放下方块时自动重新计算 NPC 的路径。

在 Unity 编辑器中打开场景以测试基本功能。其工作方式应与在 VRChat 中大致相同。进入播放模式后,NPC 将尝试到达绿色方块。你可以移动蓝色方块帮助 AI 到达目标。你可以按"Reset"按钮重新开始。

导入示例​

按照以下步骤将此示例添加到你的 Unity 项目:

  1. 从 Unity 编辑器菜单中打开示例中心窗口,路径为"VRChat SDK > 🏠 Example Central"
  2. 在列表中找到此预制件,或按标题搜索(与当前页面标题相同)。
  3. 点击"Import"按钮将 Unitypackage 导入到你的项目中。

技术解析​

让我们探讨使此场景工作的 Udon 逻辑、场景结构和网络同步。

逻辑​

场景初始化时,每个 NPC 将"NPC Finish"方块设置为其 destination。它们会尝试到达那里,但由于没有直接连接路径而失败。当每个 NPCStep 被放下时,它将调用 NavMeshSurface.BuildNavMesh 来重建主表面。如果这产生了更好的目标路径,每个 Agent 将加入以继续其旅程。每 0.5 秒,通过比较第一个 NPC 与目标方块之间的距离与初始距离(场景开始时保存的)来重新计算进度。如果在检查期间距离小于 0.15 单位,则触发粒子效果并停止进度检查。然后你可以按"Reset"按钮重新开始。

场景概述​

场景的层级结构包括以下内容:

  • "World"包含场景描述符、地板、光照等。
  • "Course"定义 NPC 可以移动的区域。
    • NavMeshSurface 组件允许 Unity 在运行时重建导航逻辑。
    • CourseManager UdonBehaviour 组件处理进度条和重置。
    • "NPC Start"和"NPC Finish"子游戏对象定义 NPC 的起始和目标位置。
    • 三个"NPC Step"子游戏对象作为 NPC 的移动表面。
      • 每个 NPC Step 有一个 NavMeshModifier 组件,该组件会尝试将其表面添加到主 NavMeshSurface。
      • 它还有一个 VRCPickup 组件和一个 UdonBehaviour,用于在携带时锁定其旋转以保持平坦,并应用重建主导航表面的逻辑。
  • "NPCs"有四个子"NPC"游戏对象,它们是带有 NavMeshAgent 和 UdonBehaviour 的胶囊体。
    • NavMeshAgent 提供基本导航和移动逻辑,而 UdonBehaviour 包含我们所需的场景逻辑。
  • "Canvas"包含进度指示器和重置按钮。

网络同步​

所有发生的事情都应为实例中的所有用户同步,通过仔细选择要同步的变量和逻辑以及在本地运行的逻辑来实现。

Course 有一个同步变量——一个 progress 浮点数,由 Course 的所有者检查,并在更新时同步给所有其他用户。其他用户监听此变量的变化,并在变化时更新其进度条。Course 还使用网络事件在 progress 大于 successThreshold(设置为 0.8)时调用 Win 事件,以考虑其他 NPC 阻挡我们测量进度的那个 NPC。

每个 NPC 在其所有者的设备上由 NavMeshAgent 移动,而 VRCObjectSync 组件为其他所有人自动更新其位置。只有 NavMesh 的所有者持续重建实际的 NavMesh,因为同步的 NPC 不需要它。


自己动手修改​

复制场景后,尝试以下一些想法来进一步发展场景,并探索 AI 导航包的功能:

  • 改变路线,将起点和终点移得更远。
  • 将可用方块从 3 个减少到 2 个。
  • 使目标点随时间移动。
  • 给世界中的每个人自己的 NPC 和 NavMesh,把它变成一场比赛!