次の方法で共有


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

Xamarin.tvOS アプリのユーザーは、デバイスの画面上の画像をタップする iOS のようにインターフェイスを直接操作するのではなく、Siri Remote を使用して部屋の反対側から間接的に操作を行います。

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

Bluetooth リモートおよびゲーム コントローラー

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

Siri Remote

ユーザーが Apple TV や Xamarin.tvOS アプリを操作する主な方法は、付属の Siri Remote を使用することです。 Apple は、ソファに座っているユーザーと、部屋の反対側の TV 画面上に表示される Apple TV のユーザー インターフェイスとの間の距離の橋渡しをするためにリモートを設計しました。

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

Siri Remote

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

機能 一般的なアプリでの使用方法 ゲーム アプリでの使用方法
Touch Surface
スワイプで移動、押すと選択、長押しでショートカット メニューの表示を行います。
タップ/スワイプ
フォーカス可能な項目間の UI 移動。

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

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

Touch Surface ジェスチャ

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

スワイプ をクリックします。 タップ
選択範囲を移動する 選択した項目をアクティブにする 方向ボタン
画面上の UI 要素間で選択対象 (フォーカス) を移動します (上、下、左、右)。 スワイプを使用すると、慣性を使用して大量のコンテンツ リストをすばやくスクロールできます。 選択された (フォーカスがあたっている) 項目をアクティブにするか、ゲームのプライマリ ボタンのように機能します。 クリックしてホールドすることで、コンテキスト メニューまたはセカンダリ機能をアクティブにできます。 Touch Surface の端を軽くタップすることは、D パッドの方向ボタンのように機能し、タップした領域に応じてフォーカスを上、下、左、または右に動かします。 アプリに応じて、非表示のコントロールを表示するために使用できます。

Apple は、以下のような Touch Surface ジェスチャを使用するための推奨事項を提供しています。

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

Siri Remote ボタン

Touch Surface のジェスチャに加えて、アプリはユーザーによる Touch Surface のクリックや、再生/一時停止ボタンの押下に応答できます。 Game Controller Framework を使用して Siri Remote にアクセスしている場合は、メニュー ボタンが押されていることを検出することもできます。

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

重要

リモート上の再生/一時停止ボタンには、常に機能を割り当てる必要があります。 機能しないボタンが存在すると、エンド ユーザーにとってはアプリが壊れているように見える可能性があります。 このボタンに対して適切な機能がない場合は、プライマリ ボタンと同じ機能 (Touch Surface クリック) を割り当てます。

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

Xamarin.tvOS アプリ内で Siri Remote を扱う最も簡単な方法は、Interface Designer 内でビューに Gesture Recognizer を追加することです。

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

  1. ソリューション エクスプローラーMain.storyboard ファイルをダブルクリックして、Interface Designer の編集用にそれを開きます。

  2. 以下のように、[ライブラリ] から [Tap Gesture Recognizer] をドラッグし、ビューにドロップします。

    タップ ジェスチャ認識エンジン

  3. 以下のように、[属性インスペクター][ボタン] セクションで [選択] にチェックを入れます。

    選択を確認する

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

  5. 次に、Tap Gesture Recognizer からアクションを引き出し、それに TouchSurfaceClicked という名前を付けます。

    タップ ジェスチャ認識エンジンからのアクション

  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# コードで直接ジェスチャを作成し、それらをユーザー インターフェイス内のビューに追加できます。 たとえば、一連の Swipe Gesture Recognizer を追加するには、ビュー コントローラーを編集し次のコードを追加します。

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 アプリ内で UIKit に基づくカスタム型 (たとえば、UIView) を作成している場合は、UIPress イベントを介してボタン押下の低レベル処理を行うことができます。

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

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

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

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 ゲーム コントローラー

ゲーム コントローラーは、ゲームプレイの質を向上させ、ゲーム内での没入感を高めるために使用できます。 これらは、標準の Apple TV インターフェイスを制御するためにも使用できるため、リモートとコントローラーの間の切り替えを行う必要はありません。

重要

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

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

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

Apple は、以下のようなゲーム コントローラーを使用するための推奨事項を提供しています。

  • ゲーム コントローラーの接続を確認する - tvOS アプリは、どのようなタイミングでもエンド ユーザーによって起動および停止される可能性があります。 アプリの起動時または awake 時には常にゲーム コントローラーが存在するかを確認し、必要に応じてアクションを実行する必要があります。
  • アプリが Siri Remote とゲーム コントローラーの両方で動作することを確認する - アプリを使用するために Siri Remote とゲーム コントローラーの間の切り替えを行うことをユーザーに要求してはいけません。 どちらの種類のコントローラーでもアプリを頻繫にテストし、すべての移動が簡単で、期待どおりに動作することを確認します。
  • 戻る方法を提供する - メニュー ボタンを押すことで常に前の画面に戻れるようにする必要があります。 ユーザーがメインのアプリ画面にいる場合、メニュー ボタンではユーザーを Apple TV のホーム画面に戻す必要があります。 ゲームプレイ中、メニュー ボタンでは、ゲームプレイを一時停止/再開するか、メイン メニューに戻る選択肢をユーザーに与えるアラートを表示する必要があります。

ゲーム コントローラーの使用

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

アプリで低レベルのコントローラー入力が必要な場合は、以下に示す tvOS に対する変更を含む Apple の Game Controller Framework を使用できます。

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

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

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

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

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

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

Info.plist エディター

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

ゲーム コントローラーとしての Siri Remote の使用

Apple TV に付属する Siri Remote は、制限付きのゲーム コントローラーとして使用できます。 これは他のゲーム コントローラーと同様に、GCController オブジェクトとして Game Controller Framework に表示され、GCMotion および GCMicroGamepad プロファイルを両方ともサポートします。

Siri Remote は、ゲーム コントローラーとして使用される場合は以下の特徴を持ちます。

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

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

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

tvOS では、ゲーム コントローラー入力を直接処理したい場合は、GCEventViewController (またはサブクラス) を使用してゲームのユーザー インターフェイスを表示する必要があります。 GCEventViewControllerFirst Responder である場合は常に、ゲーム コントローラー入力は Game Controller Framework を通してキャプチャされアプリに提供されます。

GCEventViewController クラスの UserInteractionEnabled プロパティを使用して、イベントがどのように処理されハンドリングされるかを切り替えることができます。

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

まとめ

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