Dualshock4のバックライトの色をぐりぐりいじる

はじめに

WWDC2020でGameControllerのアップデートが発表されました。

Xboxのコントローラを新規対応とし、既存のゲームコントローラの振動とバッテリー残量の検知が追加されました。

また、Dualshock4に関してはジャイロセンサー、シェイクジェスチャー、バックライトの色の値を開発者が変更したり使ったりすることができるようになりました。

完成物

実装

カラーピッカー

カラーピッカーについてはAMColorPickerを使いました。

pod 'AMColorPicker'

カラーピッカーを操作する専用のVCに遷移して色の選択を行います

let colorPickerViewController = AMColorPickerViewController()
colorPickerViewController.selectedColor = .red
colorPickerViewController.delegate = self
present(colorPickerViewController, animated: true, completion: nil)
extension ViewController: AMColorPickerDelegate {
    func colorPicker(_ colorPicker: AMColorPicker, didSelect color: UIColor) {
     // カラーピッカーで操作した色の取得
    }
}

操作画面はこんな感じです。UIも完成してるので検証にはちょうど良い👍

バックライトの変更

GCControllerに新しくlightというプロパティができており、その中のcolorを変更することでコントローラの色に反映されます。

設定するColorのクラスですがGCColorという型が新しくできていました。CGColorではないので注意⚠️

open class GCColor : NSObject, NSCopying, NSSecureCoding {
    public init(red: Float, green: Float, blue: Float)

    open var red: Float { get }

    open var green: Float { get }

    open var blue: Float { get }
}

GCControllerのバックライトを入れ替えるところはこんな感じ

guard let controller = GCController.controllers().first else {
    return
}
controller.light?.color = .init(red: r, green: g, blue: b)

今回ボタンの操作などは省いてしまいましたが過去にiOS13から対応のdualshock 4のを試すという記事を書いているので詳しく知りたい方は確認してみてください。

コード一覧

import UIKit
import AMColorPicker
import GameController

class ViewController: UIViewController {
    var myController: GCController!
    
    override func viewDidAppear(_ animated: Bool) {
        let colorPickerViewController = AMColorPickerViewController()
        colorPickerViewController.selectedColor = .red
        colorPickerViewController.delegate = self
        present(colorPickerViewController, animated: true, completion: nil)
    }
}

extension ViewController: AMColorPickerDelegate {
    func colorPicker(_ colorPicker: AMColorPicker, didSelect color: UIColor) {
        let r = Float(color.cgColor.components![0])
        let g = Float(color.cgColor.components![1])
        let b = Float(color.cgColor.components![2])
        guard let controller = GCController.controllers().first else {
            return
        }
        controller.light?.color = .init(red: r, green: g, blue: b)
    }
}

前の記事

HandTrackerを使ってみた