Xamarin の tvOS 用 Siri リモートコントローラーと Bluetooth コントローラー

Xamarin.tvOS アプリのユーザーは、デバイスの画面上で画像をタップする iOS と同様に、インターフェイスと直接対話するのではなく、Siri Remote を使用して部屋全体から間接的に対話します。

アプリがゲームの場合は、必要に応じて、サード パーティ製の Made For iOS (MFI) Bluetooth ゲーム コントローラー のサポートをアプリ内に構築することもできます。

The Bluetooth Remote and Game Controller

この記事では、Siri Remote、Touch Surface Gestures、Siri Remote Buttons について説明し、ジェスチャとストーリーボード、ジェスチャとコード低レベルのイベント処理を使用して操作する方法について説明します。 最後に、Xamarin.tvOS アプリでのゲーム コントローラーの操作について説明します。

Siri リモート

ユーザーが Apple TV や Xamarin.tvOS アプリと対話するメイン方法は、付属の Siri Remote を介して行われます。 Appleは、ソファに座っているユーザーと、テレビ画面上の部屋全体に表示されるApple TVのユーザーインターフェイスとの間の距離を埋めるためにリモコンを設計しました。

tvOS アプリ開発者としての課題は、Siri Remote のタッチサーフェイス、加速度計、ジャイロスコープ、ボタンを活用する、すばやく使いやすく視覚的に説得力のあるユーザー インターフェイスを作成することです。

The Siri Remote

Siri Remote には、tvOS アプリ内で次の機能と想定される使用法があります。

機能 アプリの一般的な使用状況 ゲーム アプリの使用状況
Touch Surface
スワイプして移動し、押してコンテキスト メニューを選択して長押しします。
タップ/スワイプ
フォーカス可能な項目間の UI ナビゲーション。

クリック
選択した (フォーカス内) 項目をアクティブにします。
タップ/スワイプ
ゲームのデザインに依存し、エッジをタップしてDパッドとして使用することができます。

クリック
プライマリ ボタン機能を実行します。
メニュー
押すと、前の画面またはメニューに戻ります。
前の画面に戻り、メインアプリ画面から Apple TV ホーム画面に終了します。 ゲームプレイを一時停止して再開し、前の画面に戻り、メインアプリ画面から Apple TV ホーム画面に終了します。
Siri/Search
Siri がインストールされている国では、音声コントロールを長押しすると、他のすべての国で検索画面が表示されます。
該当なし 該当なし
再生/一時停止
メディアを再生および一時停止するか、アプリでセカンダリ機能を提供します。
メディアの再生を開始し、再生を一時停止/再開します。 セカンダリ ボタン機能を実行するか、イントロ ビデオをスキップします (存在する場合)。
ホーム
押してホーム画面に戻り、ダブルクリックして実行中のアプリを表示し、長押ししてスリープデバイスに戻ります。
該当なし 該当なし
ボリューム
接続されているオーディオ/ビデオ機器のボリュームを制御します。
該当なし 該当なし

タッチ サーフェイス ジェスチャ

Siri Remote の Touch Surface は、Xamarin.tvOS アプリで応答できるさまざまな 1 本指のジェスチャを検出できます。

スワイプ をクリックします。 タップ
Moves selection Actives the selected item Directional buttons
画面上の UI 要素間で選択範囲 (フォーカス) を移動します (上、下、左、右)。 スワイプを使用すると、慣性を使用して大量のコンテンツ リストをすばやくスクロールできます。 選択した (フォーカス内) アイテムをアクティブ化するか、ゲームのプライマリ ボタンのように動作します。 クリックして保持すると、コンテキスト メニューまたはセカンダリ関数をアクティブ化できます。 端のタッチ サーフェスを軽くタップすると、D パッドの方向ボタンのように動作し、タップした領域に応じてフォーカスを上、下、左、または右に移動します。 アプリに応じて、非表示のコントロールを表示するために使用できます。

Apple では、Touch Surface ジェスチャを操作するための次の推奨事項が提供されています。

  • クリックとタップ を区別する - クリックはユーザーによる意図的なアクションであり、ゲームの選択、アクティブ化、プライマリ ボタンに適しています。 タップはより微妙であり、ユーザーが手にSiriリモートを保持していることが多く、誤ってタップイベントを簡単にアクティブ化できるため、控えめに使用する必要があります。
  • 標準ジェスチャ を再定義しない - ユーザーは、特定のジェスチャが特定のアクションを実行することを期待しています。アプリでこれらのジェスチャの意味や機能を再定義しないでください。 1 つの例外は、アクティブなゲームプレイ中のゲーム アプリです。
  • 新しいジェスチャを控えめに 定義する - ここでも、ユーザーは特定のジェスチャが特定のアクションを実行することを期待しています。 標準アクションを実行するためのカスタム ジェスチャの定義は避ける必要があります。 また、カスタム ジェスチャによってゲームに楽しいイマーシブ プレイを追加できる最も一般的な例外は、ゲームです。
  • 必要に応じて、D パッド タップ に応答する - タッチ サーフェイスの隅の端を軽くタップすると、フォーカスや方向を上下左右に移動するゲーム コントローラーの D パッドのように反応します。 必要に応じて、アプリまたはゲームでこれらのジェスチャに応答する必要があります。

Siri リモート ボタン

Touch Surface のジェスチャに加えて、アプリはユーザーが Touch Surface をクリックするか、[再生]/[一時停止] ボタンを押して応答できます。 ゲーム コントローラー フレームワークを使用して Siri Remote にアクセスしている場合は、メニュー ボタンが押されていることを検出することもできます。

さらに、標準 UIKit の要素を持つ Gesture Recognizer を使用して、メニュー ボタンの押下を検出できます。 押されているメニュー ボタンをインターセプトした場合は、現在のビューとビュー コントローラーを閉じ、前のビューコントローラーに戻ります。

重要

リモートの [再生/一時停止] ボタンには、常に関数を割り当てる必要があります。 機能しないボタンを使用すると、アプリがエンド ユーザーに壊れたように見える可能性があります。 このボタンに対して有効な機能がない場合は、プライマリ ボタンと同じ機能を割り当てます (Touch Surface Click)。

ジェスチャとストーリーボード

Xamarin.tvOS アプリで Siri Remote を操作する最も簡単な方法は、インターフェイス デザイナーのビューに Gesture Recognizers を追加することです。

Gestures Recognizer を追加するには、次の操作を行います。

  1. ソリューション エクスプローラー、ファイルをMain.storyboardダブルクリックして開き、インターフェイス デザイナーを編集します。

  2. ライブラリから Tap Gesture Recognizerドラッグし、ビューにドロップします。

    A Tap Gesture Recognizer

  3. [属性インスペクター] の [ボタン] セクションで [選択] をオンにします

    Check Select

  4. [選択] は、Siri リモートの Touch Surface をクリックしたユーザーにジェスチャが応答することを意味します。 メニュー、再生/一時停止、上、下のボタンに応答するオプションもあります。

  5. 次に、Tap Gesture Recognizer からアクション接続して呼び出TouchSurfaceClickedします。

    An Action from the Tap Gesture Recognizer

  6. 変更を保存し、Visual Studio for Mac に戻ります。

ビュー コントローラー (例 FirstViewController.cs) ファイルを編集し、トリガーされるジェスチャを処理する次のコードを追加します。

using System;
using UIKit;

namespace tvRemote
{
    public partial class FirstViewController : UIViewController
    {
        ...

        #region Custom Actions
        partial void TouchSurfaceClicked (Foundation.NSObject sender) {
            // Handle click here
            ...
        }
        #endregion
    }
}

ストーリーボードの操作の詳細については、Hello tvOS クイック スタート ガイド参照してください。 具体的には、 ユーザー インターフェイス の作成と、アウトレットと アクション を使用したコードの記述に関するセクションを参照してください。

ジェスチャとコード

必要に応じて、C# コードでジェスチャを直接作成し、ユーザー インターフェイスのビューに追加できます。 たとえば、一連のスワイプ ジェスチャ認識エンジンを追加するには、ビュー コントローラーを編集し、次のコードを追加します。

using System;
using UIKit;

namespace tvRemote
{
    public partial class SecondViewController : UIViewController
    {
        #region Constructors
        public SecondViewController (IntPtr handle) : base (handle)
        {
        }
        #endregion

        #region Override Methods
        public override void ViewDidLoad ()
        {
            base.ViewDidLoad ();

            // Wire-up gestures
            var upGesture = new UISwipeGestureRecognizer (() => {
                RemoteView.ArrowPressed = "Up";
                ButtonLabel.Text = "Swiped Up";
            }) {
                Direction = UISwipeGestureRecognizerDirection.Up
            };
            this.View.AddGestureRecognizer (upGesture);

            var downGesture = new UISwipeGestureRecognizer (() => {
                RemoteView.ArrowPressed = "Down";
                ButtonLabel.Text = "Swiped Down";
            }) {
                Direction = UISwipeGestureRecognizerDirection.Down
            };
            this.View.AddGestureRecognizer (downGesture);

            var leftGesture = new UISwipeGestureRecognizer (() => {
                RemoteView.ArrowPressed = "Left";
                ButtonLabel.Text = "Swiped Left";
            }) {
                Direction = UISwipeGestureRecognizerDirection.Left
            };
            this.View.AddGestureRecognizer (leftGesture);

            var rightGesture = new UISwipeGestureRecognizer (() => {
                RemoteView.ArrowPressed = "Right";
                ButtonLabel.Text = "Swiped Right";
            }) {
                Direction = UISwipeGestureRecognizerDirection.Right
            };
            this.View.AddGestureRecognizer (rightGesture);
        }
        #endregion
    }
}

低レベルのイベント処理

Xamarin.tvOS アプリ (たとえばUIView) に基づいてUIKitカスタム型を作成する場合は、イベントを介してUIPressボタン押下を低レベルで処理することもできます。

UIPressイベントとは、iOS に対するイベントの内容UITouchを tvOS に対するものです。ただし、Siri リモートまたは他の接続されている Bluetooth デバイス (ゲーム コントローラーなど) のボタン押しに関する情報が返される点が異UIPressなります。 UIPress イベントは、押されているボタンとその状態 (開始、キャンセル、変更、または終了) を表します。

Bluetooth ゲーム コントローラーなどのデバイス上のアナログ ボタンの場合、 UIPress ボタンに適用されている力の量も返されます。 イベントのプロパティは Type 、状態が UIPress 変更された物理ボタンを定義し、残りのプロパティは発生した変更を記述します。

次のコードは、以下の低レベル UIPress のイベントを処理する例を UIView示しています。

using System;
using Foundation;
using UIKit;

namespace tvRemote
{
    public partial class EventView : UIView
    {
        #region Computed Properties
        public override bool CanBecomeFocused {
            get {
                return true;
            }
        }
        #endregion

        #region
        public EventView (IntPtr handle) : base (handle)
        {
        }
        #endregion

        #region Override Methods
        public override void PressesBegan (NSSet<UIPress> presses, UIPressesEvent evt)
        {
            base.PressesBegan (presses, evt);

            foreach (UIPress press in presses) {
                // Was the Touch Surface clicked?
                if (press.Type == UIPressType.Select) {
                    BackgroundColor = UIColor.Red;
                }
            }
        }

        public override void PressesCancelled (NSSet<UIPress> presses, UIPressesEvent evt)
        {
            base.PressesCancelled (presses, evt);

            foreach (UIPress press in presses) {
                // Was the Touch Surface clicked?
                if (press.Type == UIPressType.Select) {
                    BackgroundColor = UIColor.Clear;
                }
            }
        }

        public override void PressesChanged (NSSet<UIPress> presses, UIPressesEvent evt)
        {
            base.PressesChanged (presses, evt);
        }

        public override void PressesEnded (NSSet<UIPress> presses, UIPressesEvent evt)
        {
            base.PressesEnded (presses, evt);

            foreach (UIPress press in presses) {
                // Was the Touch Surface clicked?
                if (press.Type == UIPressType.Select) {
                    BackgroundColor = UIColor.Clear;
                }
            }
        }
        #endregion
    }
}

イベントと UITouch 同様に、イベントオーバーライドのいずれかを UIPress 実装する必要がある場合は、4 つすべてを実装する必要があります。

Bluetooth ゲーム コントローラー

Apple TV に付属する標準の Siri Remote に加えて、サード パーティ製の Made For iOS (MFI) Bluetooth ゲーム コントローラーを Apple TV とペアリングし、Xamarin.tvOS アプリを制御するために使用できます。

Bluetooth Game Controllers

ゲーム コントローラーは、ゲームプレイを強化し、ゲームに没入感を提供するために使用できます。 また、標準の Apple TV インターフェイスを制御するためにも使用できるため、リモートとコントローラーを切り替える必要はありません。

重要

Bluetooth ゲーム コントローラーは、エンド ユーザーが購入する可能性があるオプションの購入です。アプリでは、ユーザーに購入を強制することはできません。 アプリがゲーム コントローラーをサポートしている場合は、すべての Apple TV ユーザーがゲームを使用できるように、Siri Remote もサポートする必要があります。

ゲーム コントローラーには、tvOS アプリ内で次の機能と想定される使用方法があります。

機能 アプリの一般的な使用状況 ゲーム アプリの使用状況
D-Pad UI 要素間を移動します (フォーカスの変更)。 ゲームによって異なります。
A 選択した (フォーカス内) 項目をアクティブにします。 プライマリ ボタン機能を実行し、ダイアログ アクションを確認します。
B アプリのメイン画面にある場合は、前の画面に戻るか、ホーム画面に終了します。 セカンダリ ボタン機能を実行するか、前の画面に戻ります。
X メディアの再生を開始するか、再生を一時停止または再開します。 ゲームによって異なります。
Y 該当なし ゲームによって異なります。
メニュー アプリのメイン画面にある場合は、前の画面に戻るか、ホーム画面に終了します。 ゲームプレイを一時停止または再開します。アプリのメイン画面にある場合は、前の画面に戻るか、ホーム画面に終了します。
左肩ボタン 左に移動します。 ゲームによって異なります。
左トリガー 左に移動します。 ゲームによって異なります。
右肩ボタン 右に移動します。 ゲームによって異なります。
右トリガー 右に移動 ゲームによって異なります。
左サムスティック UI 要素間を移動します (フォーカスの変更)。 ゲームによって異なります。
右サムスティック 該当なし ゲームによって異なります。

Apple では、ゲーム コントローラーを操作するための次の推奨事項が提供されています。

  • ゲーム コントローラー接続 の確認 - tvOS アプリは、エンド ユーザーがいつでも起動および停止できます。 常に、アプリの起動時または起動時にゲーム コントローラーが存在するようにチェックし、必要に応じてアクションを実行する必要があります。
  • Siri リモートコントローラーとゲーム コントローラーの両方でアプリが動作することを確認します 。ユーザーがアプリを使用するために Siri リモートとゲーム コントローラーを切り替える必要はありません。 多くの場合、両方の種類のコントローラーを使用してアプリをテストし、すべてが簡単に移動でき、期待どおりに動作することを確認します。
  • 戻る 方法を指定する - メニュー ボタンを押すと、常に前の画面に戻ります。 ユーザーがメインアプリの画面にいる場合は、[メニュー] ボタンをクリックすると、Apple TV のホーム画面に戻ります。 ゲームプレイ中は、[メニュー] ボタンにアラートが表示され、ユーザーはゲームプレイを一時停止または再開したり、メイン メニューに戻ったりできるようになります。

ゲーム コントローラーの操作

前述のように、Apple TV に付属する標準の Siri Remote に加えて、ユーザーは必要に応じてサード パーティ製の Made For iOS (MFI) Bluetooth ゲーム コントローラーを接続し、それを使用して Xamarin.tvOS アプリを制御できます。

アプリで低レベルのコントローラー入力が必要な場合は、tvOS 用に次の 変更を加える Apple のゲーム コントローラー フレームワーク を使用できます。

  • Siri リモートをターゲットにするために、Micro Game Controller プロファイル (GCMicroGamepad) が追加されました。
  • 新しい GCEventViewController クラスを使用して、アプリを介してゲーム コントローラー イベントをルーティングできます。 詳細については、以下の 「ゲーム コントローラー入力 の決定」セクションを参照してください。

ゲーム コントローラーのサポート要件

Apple には、Xamarin.tvOS アプリがゲーム コントローラーをサポートしている場合に満たす必要があるいくつかの特定の要件があります。

  • あなたはSiriリモート をサポートする必要があります - あなたは常にSiriリモートをサポートする必要があります。 ゲームでは、サード パーティのゲーム コントローラーをプレイ可能にする必要があります。
  • 拡張コントロール レイアウト をサポートする必要があります。すべての tvOS ゲーム コントローラーは、フォームに適合しない拡張コントローラーです。
  • ゲームはスタンドアロン コントローラー でプレイ可能である必要があります。アプリが拡張ゲーム コントローラーをサポートしている場合は、そのゲーム コントローラーのみでプレイできる必要があります。
  • [再生/一時停止] ボタンをサポートする必要があります。 ゲームプレイ中に、ユーザーが [再生]/[一時停止] ボタンを押すと、ゲームプレイを一時停止または再開したり、メイン メニューに戻ったりできるアラートを表示する必要があります。

ゲーム コントローラーのサポートの有効化

Xamarin.tvOS アプリでゲーム コントローラーのサポートを有効にするには、ソリューション エクスプローラーのファイルをダブルクリックしてInfo.plist編集用に開きます。

The Info.plist editor

[ゲーム コントローラー] セクションで、[ゲーム コントローラーを有効にする] でチェックを配置し、アプリでサポートされるすべての種類のゲーム コントローラーをチェックします。

Siri Remote をゲーム コントローラーとして使用する

Apple TV に付属する Siri Remote は、制限付きのゲーム コントローラーとして使用できます。 他のゲーム コントローラーと同様に、オブジェクトとしてGCControllerゲーム コントローラー フレームワークに表示され、プロファイルとプロファイルの両方がGCMicroGamepadGCMotionサポートされます。

Siri Remote は、ゲーム コントローラーとして使用する場合に次の特性があります。

  • Touch Surface は、アナログ入力データを提供する D パッドとして使用できます。
  • リモートは縦向きまたは横向きで使用でき、アプリはプロファイル オブジェクトが入力データを自動的に反転させるかどうかを決定します。
  • Touch Surface をクリックすると、ゲーム コントローラーのボタン A を押すのと同じように動作します。
  • [再生/一時停止] ボタンは、ゲーム コントローラーのボタン X のように機能します。
  • [メニュー] ボタンにはアラートが表示され、ユーザーはゲームプレイを一時停止または再開したり、メイン メニューに戻ったりできるようになります。

ゲーム コントローラー入力の決定

ゲーム コントローラー イベントを Touch イベントと並行して受信できる iOS とは異なり、tvOS はすべての低レベルイベントを処理して高レベル UIKit のイベントを配信します。 そのため、低レベルのゲーム コントローラー イベントにアクセスする必要がある場合は、'既定の動作' をオフ UIKitにする必要があります。

tvOS では、ゲーム コントローラーの入力を直接処理する場合は、ゲームのユーザー インターフェイスを表示するために (またはサブクラス) を使用 GCEventViewController する必要があります。 a GCEventViewController が最初の レスポンダーである場合は常に、ゲーム コントローラーの入力がキャプチャされ、ゲーム コントローラー フレームワークを介してアプリに配信されます。

クラスのプロパティを UserInteractionEnabled 使用して、イベントの GCEventViewController 処理方法と処理方法を切り替えることができます。

ゲーム コントローラーのサポートの実装の詳細については、「tvOSおよびゲーム コントローラー プログラミング ガイドのアプリ プログラミング ガイド」の「Apple のゲーム コントローラーの操作」セクションを参照してください。

まとめ

この記事では、Apple TV、Touch Surface ジェスチャ、Siri リモート ボタンに付属する新しい Siri Remote について説明しました。 次に、ジェスチャとストーリーボード、ジェスチャとコード、低レベルのイベントの操作について説明しました。 最後に、ゲーム コントローラーの操作について説明します。