You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

visionOS技术问答:如何在RealityKit中检测两个实体碰撞?

在RealityKit中检测球体碰撞的实现方法

要检测两个球体的碰撞,你需要给它们添加RealityKit的碰撞组件和物理体组件,并监听碰撞事件。以下是具体实现步骤和修改后的完整代码:

核心步骤说明

  • 添加碰撞组件(CollisionComponent):为两个球体定义碰撞检测的形状,球体用ShapeResource.generateSphere()即可。
  • 添加物理体组件(PhysicsBodyComponent):可移动球体设为.kinematic类型(手动控制位置,不受物理引擎驱动但仍能触发碰撞),另一个球体可设为.static(固定不动)。
  • 监听碰撞事件:通过subscribe(to:on:)监听CollisionEvents.Began事件,判断碰撞双方是否为目标球体,执行对应逻辑。

修改后的完整代码

import SwiftUI
import RealityKit
import RealityKitContent
import GameController

struct ImmersiveView: View {
    
    @State var sphereX: Float = 0.5
    @State var sphereY: Float = 1.5
    @State var sphereZ: Float = -1.5
    // 存储碰撞订阅,避免被提前释放
    @State private var collisionSubscription: EventSubscription?

    var body: some View {
        RealityView { content in
            guard let scene = try? await Entity(named: "Immersive", in: realityKitContentBundle) else { return }
            content.add(scene)
            
            // 获取场景中的两个球体实体
            guard let movableSphere = scene.findEntity(named: "Sphere_Right"),
                  let fixedSphere = scene.findEntity(named: "Sphere_Left") else { return }
            
            // 为可移动球体配置碰撞与物理体组件
            movableSphere.components[CollisionComponent.self] = CollisionComponent(
                shapes: [ShapeResource.generateSphere(radius: 0.5)],
                mode: .trigger,
                filter: .default
            )
            movableSphere.components[PhysicsBodyComponent.self] = PhysicsBodyComponent(
                massProperties: .init(mass: 0),
                material: .default,
                mode: .kinematic
            )
            
            // 为固定球体配置碰撞与物理体组件
            fixedSphere.components[CollisionComponent.self] = CollisionComponent(
                shapes: [ShapeResource.generateSphere(radius: 0.5)],
                mode: .trigger,
                filter: .default
            )
            fixedSphere.components[PhysicsBodyComponent.self] = PhysicsBodyComponent(
                massProperties: .init(mass: 0),
                material: .default,
                mode: .static
            )
            
            // 监听碰撞开始事件
            collisionSubscription = content.subscribe(to: CollisionEvents.Began.self, on: movableSphere) { event in
                if event.otherEntity == fixedSphere {
                    print("球体发生碰撞!")
                    // 此处可添加碰撞后的自定义逻辑,比如改变球体颜色、播放音效等
                }
            }
            
            // 保留原有的游戏控制器连接逻辑
            Task.detached {
                for await _ in NotificationCenter.default.notifications(named: .GCControllerDidConnect) {
                    Task { @MainActor in
                        for controller in GCController.controllers() {
                            controller.extendedGamepad?.valueChangedHandler = { pad, _ in
                                Task { @MainActor in
                                    let speed: Float = 0.1
                                    sphereX += pad.leftThumbstick.xAxis.value * speed
                                    sphereY += pad.leftThumbstick.yAxis.value * speed
                                    sphereZ -= pad.rightThumbstick.yAxis.value * speed
                                }
                            }
                        }
                    }
                }
            }
        } update: { content in
            guard let scene = content.entities.first,
                  let movableSphere = scene.findEntity(named: "Sphere_Right") else {
                return
            }
            movableSphere.position.x = sphereX
            movableSphere.position.y = sphereY
            movableSphere.position.z = sphereZ
        }
    }
}

关键细节说明

  • 碰撞组件的mode: .trigger表示只触发碰撞事件,不会产生物理碰撞反馈(比如球体不会被弹开),如果需要物理交互可以改成.collision。
  • 物理体组件的mass: 0是因为.kinematic和.static类型不需要质量参数,设为0即可。
  • 要确保代码中球体的名称(Sphere_Right和Sphere_Left)和你场景中的实体名称完全匹配,否则无法找到目标实体。

内容的提问来源于stack exchange,提问作者swiftyboi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 05:25:35