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

请求实现: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 19:22:42