iOS 13 から iPhone, iPadで、ps4 のワイヤレスコントローラー、DUALSHOK 4の接続が正式にサポートされました。
Appleは2019年06月に開催されたWWDC 2019の中で、定額制ゲーム配信サービス「Apple Arcade」を開始するのに伴い、これまでMFi認証を取得したコントローラーのみをサポートしてきたGame Controller frameworkをアップデートし、Sony PlayStation 4の「DualShock 4」およびMicrosoft Xbox Oneの「Xboxワイヤレスコントローラー」をtvOS 13だけでなくiOS 13/iPadOSやmacOS 10.15 CatalinaなどのAppleOSでサポートすると発表しました。
iOS 13ではPS4のDualShock 4のBluetooth接続がサポート
https://applech2.com/archives/20190919-ios-13-iphone-support-sony-ps4-dualshock-4-and-xbox-wireless-controller-over-bluetooth.html
iOS 13より前でも他の Game Controller をサポートしていたので、iOS 13 より前のアプリでも、Game Controller Frameworkに対応していれば、DUALSHOCK 4で操作できる可能性があります。
私の場合 iOS版 FF9, 聖剣伝説2 アプリが、DUALSHOCK 4で操作できることを確認しました。素晴らしいですね!
さて、それでは早速 SwiftUI から DUALSHOCK 4のボタンを検出できるコードを見ていきましょう。
以下のコードを実行する前に iPhone と DUALSHOCK 4を Bluetooth でリンクする必要があります。
以下の参考にして接続してください。
iOS 13の新機能:iPhone/iPadとPS4コントローラの繋ぎ方・使い方を解説
https://mobilelaby.com/blog-entry-how-to-connect-ps4-controller.html
接続できたら、以下のコードを Xcode で実行してください。
実行中にボタンを押すと、デバッグコンソールに各ボタンが押された旨の表示が print によって出ます。
ContentView.swift
import SwiftUI import GameController struct ContentView: View { var body: some View { Group { EmptyView() } .onReceive(NotificationCenter.default.publisher(for: .GCControllerDidConnect)) { notification in print("GCControllerDidConnect") guard let controller = notification.object as? GCController, let gamepad = controller.extendedGamepad else { return } print(String(describing: controller.vendorName)) handleGamePad(gamepad) } .onReceive(NotificationCenter.default.publisher(for: .GCControllerDidDisconnect)) { notification in print("GCControllerDidDisConnect") } } } func handleGamePad(_ gamepad: GCExtendedGamepad) { // △ ○ × □ var triangleButton: GCControllerButtonInput? var circleButton: GCControllerButtonInput? var crossButton:GCControllerButtonInput? var rectButton:GCControllerButtonInput? // ↑ ← ↓ → key var directionPad: GCControllerDirectionPad? // thumbstich var leftThumbstick: GCControllerDirectionPad? var rightThumbstick: GCControllerDirectionPad? var leftThumbstickButton: GCControllerButtonInput? var rightThumbstickButton: GCControllerButtonInput? // L1, L2, R1, R2 button var l1Button: GCControllerButtonInput? var l2Button: GCControllerButtonInput? var r1Button: GCControllerButtonInput? var r2Button: GCControllerButtonInput? // setting var optionsButton: GCControllerButtonInput? var shareButton: GCControllerButtonInput? // △ ○ × □ rectButton = gamepad.buttonX triangleButton = gamepad.buttonY circleButton = gamepad.buttonB crossButton = gamepad.buttonA // ↑ ← ↓ → key directionPad = gamepad.dpad // thumbstich leftThumbstick = gamepad.leftThumbstick rightThumbstick = gamepad.rightThumbstick leftThumbstickButton = gamepad.leftThumbstickButton rightThumbstickButton = gamepad.rightThumbstickButton // L1, L2, R1, R2 button l1Button = gamepad.leftShoulder l2Button = gamepad.leftTrigger r1Button = gamepad.rightShoulder r2Button = gamepad.rightTrigger // setting optionsButton = gamepad.buttonMenu shareButton = gamepad.buttonOptions // △ ○ × □ triangleButton?.pressedChangedHandler = { (input, value, isPressed) in guard isPressed else { return } print("press △") } circleButton?.pressedChangedHandler = { (input, value, isPressed) in guard isPressed else { return } print("press ○") } crossButton?.pressedChangedHandler = { (input, value, isPressed) in guard isPressed else { return } print("press ×") } rectButton?.pressedChangedHandler = { (input, value, isPressed) in guard isPressed else { return } print("press □") } // ↑ ← ↓ → key directionPad?.valueChangedHandler = {(_ dPad: GCControllerDirectionPad, _ x: Float, _ y: Float) -> Void in if x == 0 && y == 0 { return } print("x: \(x), y: \(y)") if x == 1.0 { print("→") } if x == -1.0 { print("←") } if y == 1.0 { print("↑") } if y == -1.0 { print("↓") } } // thumbstich leftThumbstick?.valueChangedHandler = {(_ dpad: GCControllerDirectionPad, _ xValue: Float, _ yValue: Float) -> Void in print("left stick X: \(xValue)") print("left stick Y: \(yValue)") } rightThumbstick?.valueChangedHandler = {(_ dpad: GCControllerDirectionPad, _ xValue: Float, _ yValue: Float) -> Void in print("right stick X: \(xValue)") print("right stick Y: \(yValue)") } leftThumbstickButton?.valueChangedHandler = {(_ button: GCControllerButtonInput, _ value: Float, _ pressed: Bool) -> Void in if pressed { print("left thumbstick pressed") } } rightThumbstickButton?.valueChangedHandler = {(_ button: GCControllerButtonInput, _ value: Float, _ pressed: Bool) -> Void in if pressed { print("right thumbstick presded") } } // L1, L2, R1, R2 button l1Button?.valueChangedHandler = {(_ button: GCControllerButtonInput, _ value: Float, _ pressed: Bool) -> Void in if pressed { print("L1") } } l2Button?.valueChangedHandler = {(_ button: GCControllerButtonInput, _ value: Float, _ pressed: Bool) -> Void in if pressed { print("L2") } } r1Button?.valueChangedHandler = {(_ button: GCControllerButtonInput, _ value: Float, _ pressed: Bool) -> Void in if pressed { print("R1") } } r2Button?.valueChangedHandler = {(_ button: GCControllerButtonInput, _ value: Float, _ pressed: Bool) -> Void in if pressed { print("R2") } } // setting optionsButton?.valueChangedHandler = {(_ button: GCControllerButtonInput, _ value: Float, _ pressed: Bool) -> Void in if pressed { print("OPTIONS tapped") } } shareButton?.valueChangedHandler = {(_ button: GCControllerButtonInput, _ value: Float, _ pressed: Bool) -> Void in if pressed { print("share tapped") } } }
コードは以下のサイトを参考にさせていただきました。
http://harumi.sakura.ne.jp/wordpress/2019/08/21/ios13から対応のdualshock-4のを試す/
それではよい SwiftUI ライフを!
SwiftUIを学ぶのにおすすめの本
SwiftUI 徹底入門
SwiftUIではじめるiPhoneアプリプログラミング入門
iOS/macOS UIフレームワーク SwiftUIプログラミング
コメント