Skip to main content

检测控制器碰撞

检测控制器碰撞

Unity 事件 OnControllerColliderHit 用于检测 CharacterController 何时与另一个对象碰撞。VRChat 添加了 OnControllerColliderHitPlayer 事件来检测 CharacterController 何时与另一个玩家碰撞。此事件包含一个 ControllerColliderPlayerHit 结构,其中包含被碰撞玩家的 VRCPlayerApi 对象引用。

访问检测控制器碰撞示例世界亲自体验!

使用示例​

在 Unity 编辑器中启动场景,或在 VRChat 中访问该世界。查看世界中的画布,观察"Last hit:"标签下方的空白区域在胶囊体"角色"与墙壁碰撞时会变为"Wall"。

站在胶囊体生成点和墙壁之间,使其在前往墙壁的路上撞到你,你应该看到标签在碰撞到你时变为你的显示名称!它将重置到生成点并继续撞向你,直到你移开。此时,它将再次碰撞墙壁,并将标签改回"Wall"。

导入示例​

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

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

技术解析​

场景中有一个 DetectControllerCollide 游戏对象,其中包含示例的主要预制件和逻辑。

第一个子对象 CharacterController 上有一个 CharacterController 组件以及一个带有 Graph 程序的 UdonBehaviour,该程序包含检测碰撞的逻辑。

OnCharacterControllerHitExampleGraph​

变量​

此图有以下公共变量:

名称描述
CharacterController对 CharacterController 的引用,用于在 Update() 期间调用 Move() 方法。
float moveSpeedCharacterController 的移动速度,内部乘以 Time.deltaTime。
TextMeshProUGUI hitNameText对目标文本字段的引用,在检测到碰撞时更新。
Transform characterControllerStartPosCharacterController 每次开始其旅程的位置。

事件​

图中有四个事件:

  • Update() 持续运行,在 characterController 上调用 Move() 使其前进。
  • OnControllerColliderHit() 在 characterController 与非玩家对象碰撞时运行。从事件传递的 ControllerColliderHit 结构中提取对象名称,并设置到 hitNameText 字段。
  • OnControllerColliderHitPlayer() 在 characterController 与玩家碰撞时运行。从事件传递的 ControllerColliderPlayerHit 结构中提取玩家名称,并设置到 hitNameText 字段。
  • __ResetCharacterController() 是一个自定义事件,由两个碰撞事件调用,将 characterController 重置回其起始位置。