请求实现:PS手柄X键控制visionOS沉浸式空间内立方体移动
修改方案
要实现PS手柄X键控制立方体移动,你需要添加游戏手柄的输入监听逻辑,具体修改如下:
完整修改后的代码
import SwiftUI import RealityKit import GameController struct ImmersiveView: View { @State var entity = ModelEntity() @State var z: Float = -4.0 var body: some View { RealityView { content in if let cube = try? await ModelEntity(named: "am.usdz") { entity = cube entity.generateCollisionShapes(recursive: true) entity.name = "Cube" entity.position = [0, 0, -4] entity.components.set(InputTargetComponent(allowedInputTypes: .indirect)) entity.components.set(HoverEffectComponent()) content.add(entity) } } .gesture( SpatialTapGesture() .targetedToEntity(entity) .onEnded { _ in moveCubeForward() } ) .onAppear { setupGameController() } } // 封装移动逻辑,统一手势和手柄的操作 private func moveCubeForward() { z -= 1.0 entity.position = [0, 0, z] } // 初始化游戏手柄监听 private func setupGameController() { // 配置已连接的手柄 for controller in GCController.controllers() { configureController(controller) } // 监听新连接的手柄 NotificationCenter.default.addObserver( forName: .GCControllerDidConnect, object: nil, queue: .main ) { notification in if let controller = notification.object as? GCController { configureController(controller) } } } // 配置手柄按键事件 private func configureController(_ controller: GCController) { guard let extendedGamepad = controller.extendedGamepad else { return } // 绑定PS手柄X键的按下事件 extendedGamepad.buttonX.valueChangedHandler = { _, _, pressed in if pressed { moveCubeForward() } } } }
关键修改说明
- 复用移动逻辑:把手势里的立方体移动代码抽成独立方法,让手势和手柄操作共享同一逻辑,减少冗余。
- 手柄监听机制:
- 在视图出现时初始化已连接的手柄,同时监听新手柄的连接通知,确保所有连接的手柄都能生效。
- 通过
GCController的extendedGamepad.buttonX监听PS手柄X键的按下动作,触发立方体移动。
- 触发逻辑控制:仅在按键按下瞬间(
pressed为true)执行移动,避免长按重复触发;如果需要长按连续移动,可以调整此逻辑。
内容的提问来源于stack exchange,提问作者Ostoura
相关产品推荐
相关产品推荐

