ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
Unityゲームにアクセシビリティを追加する
オープンソースのAccessibilityプラグインを使用して、AppleプラットフォームでUnityゲームにアクセシビリティ機能を追加する方法を紹介します。そして、サンプルのUnityゲームプロジェクトにVoiceOverやスイッチコントロールなどの支援技術も追加していきます。さらに、Dynamic Typeでテキストサイズを自動的に変更する方法をはじめ、透明度の低減やコントラストの向上など、インターフェイスの調整をサポートする方法も紹介します。
リソース
関連ビデオ
WWDC22
-
ダウンロード
♪ ♪
皆さん こんにちは Ericです Unityゲームに アクセスのしやすさを実現しましょう
これは すべての人が私たちの 製品を使えるようにすることです そして今日 ゲームのための 大きな一歩を踏み出しました Appleアクセシビリティ プラグインを導入しました Appleの3つの技術に 焦点を当てます
VoiceOverは 視覚障がい者を 支援することができます 画面上の項目を読み取り ユーザーが操作するための カスタムジェスチャーを 提供します
運動機能に障がいがある方は 外部スイッチを利用できる スイッチコントロールを 使うことができます そして Dynamic Typeでは 文字サイズを 設定することができます
まずは リポジトリの クローンを作成します Appleのすべてのプラグインを 構築し ビルドスクリプトを リポジトリのルートに 置いてください これでビルトフォルダが 作成され Unityプロジェクトに 組み込むことができます 最後に Unityパッケージ マネージャを使用して プラグインを プロジェクトに追加します 詳しくはリポジトリにある ドキュメントをご覧ください Unityプラグイン全般に 関するビデオをご覧ください; プラグインと再生:Appleフレーム ワークをUnityゲームプロジェクトに追加する プラグインが用意できたので 3つのエリアを説明します まず アクセシビリティについてです これによって VoiceOverやスイッチコントロール のような支援技術を ゲームでサポート可能です 次はDynamic Typeです この使いやすいユーティリティは ユーザーの好みに合わせて テキストを拡大縮小するのに役立ちます そして UI適応設定 このユーティリティは他のユーザーの 設定を読み取るために役立ちます まずはアクセシビリティ からスタートしましょう
コンセプトの説明用に 簡単な カードゲームを作りました 「Flip」ボタンを タップすると ランダムに2枚のカードを 引くことができます しかし VoiceOverでは 画面上の文字が読めず 外部スイッチでは ボタンが押せません これは単なるピクセルで しかないからです システムが相互作用を 理解する必要があります アクセシビリティ要素は 支援技術が相互作用 できるものを定義します
画面上の文字 カード ボタンが アクセシビリティの 要素であるべきです そして 各要素をラベルで 説明することができます VoiceOverがラベル読み上げることで ユーザーは画面の内容を理解できます
そして もしこのゲームが 多言語に対応していれば このラベルも ローカライズすべきですね
さて VoiceOverは画面の表示を 説明することはできますが タップできるボタンを 認識できません 「traits」と呼ばれる 別のプロパティを使用して システムに要素のタイプを 通知することができます ここにボタンの特性を 追加する必要があります これでVoiceOverは 「Flip button」と読みます 外部スイッチがこのボタンを コントロールできます
テキストに「Static Text」 特性を追加もできます 「Static Text」の特性は ラベルやエリアに付与され VoiceOverがより良い 相互作用体験を提供します
そして 「Button」や 「Static Text」を以外にも さらに多くの特徴があります
では カードにはどのような 特徴を持たせればいいでしょうか? すべてのアクセシビリティ要素に 特徴を使う必要はありません カードに特性は必要ありません しかし それぞれのカードには まだVoiceOverが 認識していない部分 つまりカードフェイスがあるのです もうひとつ 「Value」という プロパティがあります
各カードに 「Value」を 追加すると VoiceOverでは カード1はクラブの3を カード2はクラブのエースの 値を示します 以上です 基本を理解したところで Unityを開いてみましょう プロジェクトに 追加する方法を確認します
このゲームの Unityエディタにいます すでに Appleアクセシビリティ プラグインを追加しました
まず カメラのような通常の シーンオブジェクトがあリマス 直射日光 そしてUIキャンバスもあります キャンバスの下には 2つのテキスト要素と ボタンがあります カード用ゲームオブジェクト を2つ用意しました
各2つのメッシュ部品で 構成されています 表と裏のテクスチャを それぞれレンダリングします まず アクセシビリティ 要素を定義しましょう プラグインに 構成要素が必要です
階層にあるすべてのアクセシブルにしたい オブジェクトを選択します
そして 構成要素を追加して アクセシビリティ要素にします
次に ラベルを追加します カードオブジェクトを 選択し 右側の「Accessibility Node」 構成要素をクリックし 「Label」フィールドを 探します
また ラベルフィールドの チェックボックスがチェックされている
ことを確認します 次に 「Card 1」と入力します
そして カード2も同様です
テキストやボタンにも ラベルが必要ですが Unity UIの標準コントロール を使用する場合は 明確なアクセシビリティ ラベルの提供は必要ありません プラグインはすでに デフォルトで実装されています
次に ボタンに特徴を追加します
フリップボタンを選択して 「traits」を 「None」から 「Button」に変更します
2つのテキスト要素を選択…
そして 「traits」を 「Static Text」に変更します
素晴らしいですね 最後に カードのアクセシビリティの 値を設定します カードはランダムに 引くのでスクリプトを 追加して 動的に値を設定します
2枚のカードを選択し 新しいスクリプトを追加します
まず 他のCシャープの ファイルの1つで すでに Playing Cardという カードフェイスの列挙型があります AccessibleCardの MonoBehaviorスクリプトでは カードの種類を表す変数として カードが上向きか 下向きかを表しています
では アクセシビリティ値を 追加してみましょう accessibilityNodeを このgameObjectにアタッチします
次に accessibilityValue デリゲートをカードの フェイス値を動的に返す 関数に設定します
この関数の内部で カードが覆われている場合 accessibilityValueの 「covered」を返します カバーされていない場合は カードフェイスを列挙し それぞれについて 「Ace of Spades」のような説明を 返します 以上です では プロジェクトをビルドして その動きを見てみましょう これが私たちのゲームです VoiceOverをオンにしましょう
自動音声:VoiceOverオン Ericのゲーム カード2 カバーあり Eric:右にスワイプで 次の要素に移動できます 自動音声:カード1 カバーあり
Ericのカードゲーム
カードをめくる
フリップ ボタン Eric:5つの オブジェクトがすべて VoiceOverでアクセスできる ようになりました ボタンをタップしたい場合は ダブルタップします 自動音声:フリップ Eric;もう一度 カードを確認しましょう
自動音声:カード1 クラブの2
カード2 クラブのエース Eric:VoiceOverで 読み上げられるようになりました かっこいいですね 何百万人ものVoiceOverユーザーが 私たちのゲームを届けましたね その人たちは今このゲームに 恋をしているのです 外部スイッチコントロールを使っていても ゲームをプレイできます 以上がアクセシビリティ要素でした 次に Dynamic Typeに ついて説明します
ゲームって難しいですよね 多くの人にとって 文字が小さくて読めない そこで iOSとtvOSでは 誰もが設定で 自分の読書能力に合った 文字サイズを選べます
アクセシビリティ プラグインではこの設定値を 読み込むことで 期待通りの 大きさの表示が確認できます
Dynamic Typeの使い方を ゲームの例を見てみましょう
DynamicTextSize.csという スクリプトを作ります 最初にデフォルトの文字サイズを 変数に格納します 次にOnEnable関数の内部で 設定変更イベントを受信します PreferredTextSizesChangedで AccessibilitySettingsを使用します これにより ユーザーがテキスト設定を 変更すると すぐにUIが更新されます
次に settingsChanged 関数の内部です PreferredContentSize Multiplierを最初に読み込み 元の文字サイズに乗じて テキスト要素に 割り当て直します Unityエディタ内では Text要素を持つゲーム オブジェクトを 全て選択します 先ほど作成したDynamic TextSizeを追加します
これでDynamic Typeを サポートしました 結果を実際に見る前に まず Dynamic Typeを ゲームで素早くテストする 方法を紹介します 設定を開き コントロール センターを探します
「Text size」が表示されるまで 下にスクロールしてください
これでコントロールセンターを 開いて 文字サイズを 変更することができます
素晴らしいですね リアルタイムに フォントサイズが調整されました
コントロールセンターで 表示されるテキストパーセンテージ値は 先ほどの倍率を 読み取っています この設定は テキスト以外の オブジェクトにも採用できます 例えば カードフェイスの アセットを入れ替えて Large Printに変更すると サイズが大きくなります
まず DynamicCardFacesという スクリプトを作成します 先ほどのようにTextSizeChanged イベントにサブスクライブします
倍率を読み取る代わりに スライダーの目盛りに マッピングされた文字サイズ カテゴリの列挙を読みます 大きいサイズが選択されると いつでも アセットを入れ替えることができます
そして 通常の素材と大判の素材の どちらかを選ぶだけです では 大きなサイズを 選ぶと…
ユーザーは大判のカードを 見ることになり 弱視の人にとても読みやすい 素晴らしいカードフェイスです
最後に このプラグインから アクセスできる UI適応設定について お話したいと思います
最初の設定は 透明度を下げることです この設定がオンの場合 背景が不透明になります ぼかしや透明感のある 効果ではなく 読みやすさを 向上させることができます この設定を確認するには AccessibilitySettings IsRuceTransparency Enabledを呼び出します
次に コントラストを 上げる設定です ダークグレーでスイッチ類を 目立たせています デバイス全体でコントロールを 認識しやすくします
AccessibilitySettings. IsIncreaseContrastEnabled この設定を確認することで これが有効なときに あなたのUIでコントラストを 上げることができます
次に 動きを抑える 設定です 動きに対して 敏感な人もいます
このアニメーションは「Reduce Motion」 がオンの時は 削除する必要があります
これを実行するための コードを見てみましょう
CardControllerスクリプトに Flip関数があります Reduce Motionがオンに なっているかを確認します オンではない場合 コルーチンで アニメーションを起動します それ以外は回転を設定するだけです アニメーションはなしです 以上です このように 動きに敏感な 方にも楽しんでいただけます まとめです まずApple Accessibility プラグインを使い始めるには セッションにリンクされているGitHubの リポジトリをクローンします
アクセシビリティ要素の追加して VoiceOverやスイッチコントロールを 使って ユーザーが ゲームを楽しめるようにしましょう
Dynamic Typeで 文字サイズを変更できます
そして UI適応設定についても 確認しましたね 誰もが素晴らしい 体験ができるよう願っています
ご参加ありがとうございました アクセシビリティに優れた 誰もが楽しめるゲームを どのように実現するか 楽しみにしています
-
-
7:43 - PlayingCard enum
public enum PlayingCard { AceOfSpade, AceOfClubs, AceOfDiamonds }
-
7:53 - AccessibleCard class
using Apple.Accessibility; public class AccessibleCard : MonoBehaviour { public PlayingCard cardType; public bool isCovered; void Start() { var accessibilityNode = GetComponent<AccessibilityNode>(); accessibilityNode.accessibilityValueDelegate = () => { if (isCovered) { return "covered"; } if (cardType == PlayingCard.AceOfSpades) { return "Ace of Spades"; } } } }
-
10:35 - DynamicCardFaces
public class DynamicCardFaces : MonoBehaviour { public Material RegularMaterial; public Material LargeMaterial; void OnEnable() { AccessibilitySettings.onPreferredTextSizesChanged += _settingsChanged; } void _settingsChanged() { var shouldUseLarge = AccessibilitySettings.PreferredContentSizeCategory >= ContentSizeCategory.AccessibilityMedium; GetComponent<Renderer>().material = shouldUseLarge ? RegularMaterial : LargeMaterial; } }
-
10:36 - Dynamic Type
using UnityEngine.UI; public class DynamicTextSize : MonoBehaviour { int originalSize; void Start() { originalSize = GetComponent<Text>().textSize; } void OnEnable() { AccessibilitySettings.onPreferredTextSizesChanged += _settingsChanged; } void _settingsChanged() { GetComponent<Text>().textSize = (int)(originalSize * AccessibilitySettings.PreferredContentSizeMultiplier); } }
-
14:54 - Reduce motion
using Apple.Accessibility; public class CardController : MonoBehaviour { public void Flip() { var reduceMotionOn = !AccessibilitySettings.IsReduceMotionEnabled; if (!reduceMotionOn) { StartCoroutine(Animate()); } else { transform.rotation = Quaternion.identify; } } IEnumerator Animate() { } }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。