AI 导航示例
示例世界

Udon 可以使用 AI 导航。此示例展示了如何将其用于寻路和创建在世界中行走的 NPC 角色。
访问 AI 导航示例世界亲自体验!
使用示例
此场景包含一组 NPC,它们试图从红色方块到达绿色方块。你可以移动蓝色方块为它们搭建路径。Unity 的 AI 导航会在你放下方块时自动重新计算 NPC 的路径。
在 Unity 编辑器中打开场景以测试基本功能。其工作方式应与在 VRChat 中大致相同。进入播放模式后,NPC 将尝试到达绿色方块。你可以移动蓝色方块帮助 AI 到达目标。你可以按"Reset"按钮重新开始。
导入示例
按照以下步骤将此示例添加到你的 Unity 项目:
- 从 Unity 编辑器菜单中打开示例中心窗口,路径为"VRChat SDK > 🏠 Example Central"
- 在列表中找到此预制件,或按标题搜索(与当前页面标题相同)。
- 点击"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,把它变成一场比赛!