检测控制器碰撞

Unity 事件 OnControllerColliderHit 用于检测 CharacterController 何时与另一个对象碰撞。VRChat 添加了 OnControllerColliderHitPlayer 事件来检测 CharacterController 何时与另一个玩家碰撞。此事件包含一个 ControllerColliderPlayerHit 结构,其中包含被碰撞玩家的 VRCPlayerApi 对象引用。
访问检测控制器碰撞示例世界亲自体验!
使用示例
在 Unity 编辑器中启动场景,或在 VRChat 中访问该世界。查看世界中的画布,观察"Last hit:"标签下方的空白区域在胶囊体"角色"与墙壁碰撞时会变为"Wall"。
站在胶囊体生成点和墙壁之间,使其在前往墙壁的路上撞到你,你应该看到标签在碰撞到你时变为你的显示名称!它将重置到生成点并继续撞向你,直到你移开。此时,它将再次碰撞墙壁,并将标签改回"Wall"。
导入示例
按照以下步骤将此示例添加到你的 Unity 项目:
- 从 Unity 编辑器菜单中打开示例中心窗口,路径为"VRChat SDK > 🏠 Example Central"
- 在列表中找到此预制件,或按标题搜索(与当前页面标题相同)。
- 点击"Import"按钮将 Unitypackage 导入到你的项目中。
技术解析
场景中有一个 DetectControllerCollide 游戏对象,其中包含示例的主要预制件和逻辑。
第一个子对象 CharacterController 上有一个 CharacterController 组件以及一个带有 Graph 程序的 UdonBehaviour,该程序包含检测碰撞的逻辑。
OnCharacterControllerHitExampleGraph
变量
此图有以下公共变量:
| 名称 | 描述 |
|---|---|
CharacterController | 对 CharacterController 的引用,用于在 Update() 期间调用 Move() 方法。 |
float moveSpeed | CharacterController 的移动速度,内部乘以 Time.deltaTime。 |
TextMeshProUGUI hitNameText | 对目标文本字段的引用,在检测到碰撞时更新。 |
Transform characterControllerStartPos | CharacterController 每次开始其旅程的位置。 |
事件
图中有四个事件:
Update()持续运行,在 characterController 上调用Move()使其前进。OnControllerColliderHit()在 characterController 与非玩家对象碰撞时运行。从事件传递的ControllerColliderHit结构中提取对象名称,并设置到hitNameText字段。OnControllerColliderHitPlayer()在 characterController 与玩家碰撞时运行。从事件传递的ControllerColliderPlayerHit结构中提取玩家名称,并设置到hitNameText字段。__ResetCharacterController()是一个自定义事件,由两个碰撞事件调用,将 characterController 重置回其起始位置。