WWDC Quick Look 💓 By SwiftGGTeam
Add accessibility to your Unity games

Add accessibility to your Unity games

元の動画を見る

ハイライト

Apple は、オープンソースの Unity アクセシビリティ プラグイン (Apple Unity Plug-Ins) を WWDC 2022 でリリースしました。これにより、Unity ゲーム開発者は、Apple のアクセシビリティ API を最初から学ばなくても、ネイティブ アプリケーションのように、VoiceOver、Switch Control、Dynamic Type などの補助機能にアクセスできるようになります。


主要内容

Apple プラットフォームでの Unity ゲームのアクセシビリティ サポートは、常に悩みの種でした。ネイティブ開発者は、UIAccessibility プロトコルである SwiftUI を使用できます。accessibilityLabelVoiceOver にアクセスするための修飾子ですが、これらの API は Unity エンジンでは使用できません。その結果、多くの Unity ゲームにはアクセシビリティがまったくサポートされておらず、視覚障害や運動障害のあるユーザーはアクセスできません。

このセッションで紹介された Apple Unity プラグインは、この問題を解決します。 Unity側で提供しますAccessibilityNodeコンポーネントとAccessibilitySettingsAPI の最下層は、ネイティブ ブリッジング層を介して iOS/macOS アクセシビリティ システムに接続します。開発者は、Unity Inspector で設定するためにネイティブ コードを 1 行記述する必要はありません。AccessibilityNodeこれにより、VoiceOver がゲーム オブジェクトを正しく読み上げることができるようになります。

Sessionではデモンストレーションケースとして記憶合わせカードゲーム(メモリーマッチ)を使用しています。ゲームの中心となるインタラクションは、カードを裏返してパターンを一致させることですが、元のカードは VoiceOver には完全に表示されません。それらは UIKit の UIView ではなく、Unity GameObject です。それぞれのカードを付けることでAccessibilityNodeコンポーネントと実装accessibilityValueDelegate, VoiceOver ユーザーは「スペードのエース」や「カバード」などの説明を聞くことができ、通常どおりゲームに参加できます。

VoiceOver に加えて、プラグインはダイナミック タイプもサポートしています。ユーザーがシステム設定でフォント サイズを大きくすると、ゲーム内のテキストとカード パターンが自動的に拡大縮小されます。 Reduce Motion をサポート - ユーザーが弱めるダイナミック効果をオンにすると、カードを反転するアニメーションがスキップされ、結果が直接表示されます。透明度を下げる、コントラストを上げるなどのインターフェイス適応オプション。


詳細

Apple Unity Accessibility プラグインに接続する

プラグインは Unity Package Manager を通じてインストールされ、ソース コードは GitHub でホストされます。インストール後、VoiceOver で読み取る必要がある各ゲームオブジェクトをマウントする必要がありますAccessibilityNodeコンポーネント。

1 つ目は、カード列挙型を定義することです (07:43):

public enum PlayingCard
{
    AceOfSpade,
    AceOfClubs,
    AceOfDiamonds
}

次に、それをカードの MonoBehaviour に実装します。AccessibleCardクラス (07:53):

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";
            }
        }
    }
}

キーポイント:

  • GetComponent<AccessibilityNode>()同じゲームオブジェクトにマウントされているアクセシビリティ ノードを取得する
  • accessibilityValueDelegate文字列を返すデリゲートです。VoiceOver が読み込むときに呼び出されます。
  • によるとisCoveredステータスは、カードがカバーされているか露出されているかをユーザーに知らせるために、さまざまな説明を返します。
  • カードが公開され、それがスペードのエースの場合は、「スペードのエース」を返します。これは VoiceOver によって読み上げられます。

動的タイプのサポート

ダイナミック タイプを使用すると、システムのフォント サイズ設定に従ってテキストとグラフィックを自動的に拡大縮小できます。プラグインが渡されましたAccessibilitySettingsこのクラスはフォント サイズ情報を提供します (10:35):

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;
    }
}

キーポイント:

  • 購読するAccessibilitySettings.onPreferredTextSizesChangedシステムのフォント サイズが変更されたときにトリガーされるイベント
  • PreferredContentSizeCategory現在のシステム フォント サイズ カテゴリを返します。
  • フォントサイズ以上の場合AccessibilityMedium必要なときは、文字を拡大したときに模様がはっきりと認識できるように、より大きなカード素材(Largematerial)に切り替えます。

テキスト自体も拡大縮小する必要があります (10:36):

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);
    }
}

キーポイント:

  • テキストの元のサイズを保存originalSize
  • 使用PreferredContentSizeMultiplier元のサイズを乗算して新しいフォント サイズを取得します
  • PreferredContentSizeMultiplierこれは、ユーザーのフォント サイズ設定に基づいてシステムによって計算される倍率です。自分でテーブルを調べる必要はありません。

動きを減らすサポート

ダイナミック効果を低減することは、動きに敏感なユーザーにとって重要な設定です。メモリ マッチング ゲームでは、カードをめくるアニメーションが不快感を引き起こす可能性があるため、[モーションを減らす] がオンになっていることが検出された場合、アニメーションをスキップする必要があります (14:54):

using Apple.Accessibility;
public class CardController : MonoBehaviour
{
    public void Flip() 
    {
        var reduceMotionOn = !AccessibilitySettings.IsReduceMotionEnabled;
        if (!reduceMotionOn)
        {
            StartCoroutine(Animate());
        }
        else 
        {
            transform.rotation = Quaternion.identity;
        }
    }
    IEnumerator Animate()
    {
    } 
}

キーポイント:

  • AccessibilitySettings.IsReduceMotionEnabledユーザーがシステム設定で動的効果の低減をオンにしているかどうかを返します。
  • 有効にすると、アニメーション コルーチンをスキップし、カードの回転を直接リセットします。Quaternion.identity(表向き)、ユーザーは結果を即座に確認できます
  • 電源が入っていない場合は、通常通りにプレイしてくださいAnimate()コルーチンでアニメーションを反転する
  • このロジックは次の場所に配置されます。Flip()この方法では、カードを裏返すたびにチェックされます。

インターフェース適応オプション

上記の 3 つの主要な機能に加えて、プラグインは次の設定も公開します。

  • AccessibilitySettings.IsReduceTransparencyEnabled: 透明度を下げるがオンになっているかどうかを確認します
  • AccessibilitySettings.IsIncreaseContrastEnabled:強調コントラストがオンになっているかどうかを確認します
  • AccessibilitySettings.IsBoldTextEnabled: 太字がオンになっているかどうかを確認します

これらはすべて次の場所にあります。Start()またはOnEnable()読み取ってマテリアルの切り替えや UI の調整と連携して適応を実現します。たとえば、透明度の低減をオンにすると、半透明の背景が不透明に変更されます。コントラスト強調がオンになっている場合、より高いコントラストの配色が使用されます。


重要ポイント

  1. AccessibilityNode をゲームのインタラクティブ オブジェクトにアタッチします: ゲームプレイに重要な影響を与えるゲーム内のオブジェクト (カード、ボタン、キャラクター、小道具) を見つけて、それらを 1 つずつマウントしますAccessibilityNodeコンポーネントと実装accessibilityValueDelegate。実行する価値がある理由: VoiceOver ユーザーはゲームの状態を理解するために完全に画面の読み取りに依存しており、AccessibilityNode のない GameObject は彼らにとって何の意味もありません。開始方法: Unity でゲーム シーンを開き、最も重要なインタラクティブ オブジェクトを 5 つ選択し、それぞれにアタッチします。AccessibilityNodeそして、現在の状態の説明を返すデリゲートを作成します。

  2. ダイナミック タイプ イベントをリッスンし、テキストとグラフィックを同期的に拡大縮小します: サブスクライブonPreferredTextSizesChanged、使用PreferredContentSizeMultiplierすべてのテキスト コンポーネントのフォント サイズを拡大縮小し、主要なグラフィックスに大きなバージョンのマテリアルを準備します。その価値がある理由: 視力の低いユーザーはシステムのフォント サイズを非常に大きく調整するため、ゲーム テキストがそれに応じて拡大されないと、まったく読むことができなくなります。開始方法:DynamicTextSizeスクリプトはすべての Text コンポーネントにハングされ、その後、主要なグラフィックス (カード、アイコンなど) 用に準備されます。LargeMaterial亜種。

  3. モーション再生スイッチを使用してアニメーションの再生を制御します: アニメーションの再生前に確認してくださいIsReduceMotionEnabled、オンにするとアニメーションをスキップし、結果を直接表示します。実行する価値がある理由: 動きに敏感なユーザーは、高速で反転したり、跳ねたり、回転したりするアニメーションやその他のアニメーションを見ると、めまいや不快感を感じることがあります。アニメーションを直接スキップすることは、彼らに対する基本的な敬意です。開始方法: アニメーションが再生されるゲーム内のすべての場所 (フロップ、カットシーン、特殊効果) を見つけて、各入り口に 1 つ追加します。if (AccessibilitySettings.IsReduceMotionEnabled) return;診る。


関連セッション

コメント

GitHub Issues · utterances