ゲームアクセシビリティの取り組みについて

こんにちは。個人でゲーム開発をしておりますToya Shiwasuと申します。この記事では、拙作のオンラインアクションRPGでのアクセシビリティの取り組みについて紹介させていただきます。

# アクセシビリティとは
アクセシビリティとは、障害の有無に関わらず、誰でも使える、誰でも使いやすいように工夫することです。例えば、字幕があれば耳の不自由な方でも台詞の内容がわかりますし、フルボイスなら目の不自由な方でもゲームをプレイできるかもしれません。最近のゲームとしては、PS4の『The Last of Us Part II』というゲームが、ストーリーに賛否両論はあるものの、高いアクセシビリティで評価されています。

# アクセシビリティ対応の経緯
拙作のオンラインアクションRPGは、2018年10月17日にVersion 1.0を公開し、当時は特にアクセシビリティに配慮したゲームではありませんでした。ほそぼそとアップデートを続けて、2019年12月08日にVersion 2.0を公開し、最終エリアを実装し、エンディングまで作り終えました。
さて次に何をしようかとなって、ゲームの3DCG化を検討したりしばし迷走した後、オーディオゲームというものを知りました。オーディオゲームとは主に視覚障害者向けの音声だけでプレイするゲームで、比較的シンプルなミニゲームから重厚長大な長編のRPGまでいろいろあります。
2020年02月頃からゲームの読み上げ及び3Dサウンドの対応を始めました。当初は1ヶ月位で対応できるだろうと根拠のない見積もりをしていたのですが、実際にやってみるとUIはすべて作り直しになったり、なかなか大変でした。そして、8ヶ月後の2020年10月09日にVersion 2.1の「アクセシビリティアップデート」として、公開できました。その後も、主にアクセシビリティ機能を中心にアップデートを続けています。

# 視覚障害者向けの機能
視覚障害者向けの機能としては、テキストの読み上げ機能、3D効果音機能、全てのUIの再設計、配色、UI倍率の最大値の引き上げ、効果音のカスタマイズ、ジェスチャが挙げられます。私自身は晴眼者（目の見える人）ですが、実際に画面を見ずにテストプレイを行い、ソロでの討伐を想定していた中ボスを音だけを頼りにソロで撃破しています。また、全盲の方から何件かクリア報告をいただいています。

## テキストの読み上げ機能
テキストの読み上げ機能とは、ゲーム中の全てのテキストをOSの読み上げ機能を用いて読み上げる機能です。残念ながら、Unityの標準機能には音声合成がなかったので、OSの読み上げ機能のラッパーライブラリを自作しました。

現在の読み上げ対応の動画です。

<iframe width="560" height="315" src="https://www.youtube.com/embed/NdPOrsm3cDQ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

現在のバージョンでは自作ライブラリを使用して実装しています。利用したAPIなどは以下の表のとおりです。

| プラットフォーム | 言語 | API | 備考 |
|:-:|:-:|:-:|:-:|
| Widnow  | C++  | SAPI  | Speak()はSPF_ASYNCをしてもブロッキングする。Skip()もブロッキングする。なのでスレッドは必須。あと、Speak()は呼び出しても、すぐにはSPRS_IS_SPEAKING状態にならないので、直後にSleep(100)を入れておく。  |
| Mac  | Objective-C  | NSSpeechSynthesizer  |   |
| Android  | Java  | TextToSpeech  | 初期化の完了がコールバック式なので、じみに扱いづらい。  |
| iOS  | Objective-C++  | AVSpeechSynthesizer  | ロビーサーバーがIPv6対応していないため、iOS版はリリースしていません。  |
| Linux  | C#  | espeak, espeak-ng  | Processクラスを用いてコマンドライン引数を渡すことで操作。  |
| WebGL  | JavaScript  | speechSynthesis  | ネットワークライブリがWebGLに対応していないため、WebGL版はリリースしていません。  |

## 3D効果音機能
キャラクターが縦横に動き回るアクションゲームにおいて、キャラクターの位置を音声だけで伝えるのはなかなか難しい課題です。Cキーで相対的な方向と距離を読み上げる機能も用意しましたが、戦闘ではリアルタイム性にかけます。
3D効果音機能とは、プレイヤーから見て左で発生した効果音はヘッドホンの左から、右で発生した効果音はヘッドホンの右から、上で発生した効果音は高い音で、下で発生した効果音は低い音で、それぞれ再生される機能です。左右は特に問題ないですが、上下を音の高低で区別するのは少々直感的ではありません。しかし、オーディオゲームではよく使われる手法であり、私は慣れれば割と区別できるようになりました。

現在の3D効果音対応の動画です。冒頭では葉擦れの音がする木の周りを時計回りに移動しています。

<iframe width="560" height="315" src="https://www.youtube.com/embed/WafNZueBX3s" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

UnityにはAudio SourceにPitchとSpatial Blendという項目があったので、それを使いました。音圧（音の大きさ）は距離によって減衰するのですが、減衰の仕方は試行錯誤で調整しました。
効果音のゲームオブジェクトにアタッチしたAudioSorceの設定の画像です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1225028/2a39d5cc-85a1-ac4c-6900-4c088e2b4e67.png)

## 全てのUIの再設計
テキストの読み上げ機能とともに全てのUIの再設計を行いました。

現在のメインメニューの画像です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1225028/5dd2b998-2ad7-cf7a-2664-c899d3dbc33f.png)

特に全盲の方はUIのコンポーネントがどのように配置しているか見えないため、フォーカスの移動方法を分かりやすくするのは重要です。最終的にはほぼすべてのコンポーネントは上下に配置し、キャラ削除のトグルなどだけ例外的に左右に配置しています。インベントリスロットは、もともと縦横のグリッド表示だったのですが、上下のリスト表示を追加し、そちらをデフォルトにして、オプションで切り替えられるようにしています。
アイテムウィンドウの所持金などのリスト項目以外の付加的な情報は、Cキーを押すと読み上げるようにしています。取扱説明書にはCキーでいろいろ読み上げられることを明記していたのですが、ユーザーから所持金はどうやって知るのだという質問が何回か寄せられました。分かりづらかったかもしれません。

## UI倍率の最大値の引き上げ
Version 2.6でUI倍率の最大値の引き上げを行いました。最初はフォントサイズの変更を目指していたのですが、レイアウトが複雑になりそうなので断念しました。その代わりにウィンドウ全体を拡大するようにしました。仕様上アスペクト比以上に拡大はできませんが、ここまで大きくできるゲームは、なかなかないのではないでしょうか。

16:9のアスペクト比でUI倍率を最大にした時の画像です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1225028/dd4ef8fd-a9df-f58a-af66-566f8494ea3a.png)

## 配色
色覚多様性（色覚特性、色覚異常、色盲などとも呼ばれる）の方にとって、ゲームの配色も重要となります。人の色を感じる錐体細胞には3つの種類があり、障害のある錐体細胞によって色の見え方は異なります。なので、こうすれば大丈夫といった明確な配色はないのですが、次のサイトに無難な配色の例が掲載されています。
https://jfly.uni-koeln.de/colorset/
このサイトを参考にゲーム内の一部アイコンを修正しました。

ポーションを販売するショップの画像です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1225028/18dae532-f28c-7318-47af-cc557f640758.png)

回復アイテムのポーションの種類が色でしか判別できないのは問題だと考え、種類によって突起を付けました。それでも分かりづらかったので、左上に種類を表す文字を入れました。魔法書アイテムの配色は、無難な配色に修正しています。転移アイテムの種類が色でしか判別できなかったので、数字を入れました。オーブという種類のアイテムは、形状を全て変更しました。ただし、実在する物体の色は変更せずそのままにしています。赤いリンゴは赤く描いていいはずです。

オプションでウィンドウやテキストの配色を変更する機能も実装しています。

配色ウィンドウの画像です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1225028/25db2754-8506-c3a7-37af-a6f0880b17d0.png)

## 効果音のカスタマイズ

効果音のカスタマイズ機能は効果音を確認したり、音量を個別に設定したり、ファイルを差し替えたりできる機能です。何人かから要望を頂いたため実装しました。というか、この市販のゲームの効果音が素晴らしいからこれに差し替えろとか、メールで効果音のファイルを送られても反応に困るのです。

効果音のカスタマイズウィンドウの画像です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1225028/e0241c30-f69b-6031-d719-c16df88e8c2c.png)

## ジェスチャ

Android版でUIをタッチジェスチャにより操作できる機能です。キーボードの上下左右の代わりに上下左右へのスワイプで操作できる感じです。画面端をタップでマップ移動、画面端からのスワイプでウィンドウを開いたり、ロックオン、キャンセルができます。ただ、ジェスチャの場合、どうしてもボタンが不足してしまうので、「攻撃をポケット1に変更する。」、「ポーションを自動で使用する。」、「ドロップを自動で取得する」などの項目を同時にオプションに追加しました。

ジェスチャの操作方法は以下の表のとおりです。

| 機能 | デフォルトボタン |
|:-:|:-:|
| 決定、攻撃、NPCに話しかける、ドロップを拾う、ポケット使用  | 画面中央でタップ  |
| 移動  | 画面中央でスワイプ  |
| マップ移動  | 画面の上下左右の端をタップ  |
| マップウィンドウを開く  | 画面上端から下へスワイプ  |
| メニューウィンドウを開く  | 画面下端から上へスワイプ  |
| ロックオン  | 画面左端から右へスワイプ  |
| キャンセル  | 画面右端から左へスワイプ  |

# 聴覚障害者向けの機能
聴覚障害者向けの機能としてはオーディオマークを表示、オーディオスペクトラムを表示が挙げられます。私自身あまり調査していないこともあって、まだまだ対応は不十分と感じています。また、聴覚障害者は視覚障害者と比べて遊べる市販のゲームも多いこともあって、わざわざ個人開発のゲームが遊ばれるかという問題もあります。まあ、後者はゲームのクオリティの問題なのでこれ以上言及はしません。このゲームでは隠れた敵を足音で見つけるなどの要素はないため、あまり必要ではなかったかもしれません。

## オーディオマークを表示とオーディオスペクトラムを表示
オーディオを視覚的に表現する機能とオーディオスペクトラムを折れ線グラフで表示する機能です。

オーディオマークを表示とオーディオスペクトラムを表示の動画です。

<iframe width="560" height="315" src="https://www.youtube.com/embed/e5Ea-FxBVyk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

# 盲ろう者向け機能
盲ろう者向けの機能としてはオーディオの振動出力機能、NVDA点字機能、読み上げのモールス出力機能が挙げられます。
グラフィックスもオーディオも利用できない盲ろう者が遊べるコンピュータゲームはかなり少ないようです。味覚や嗅覚を使ったデバイスはあまり一般的ではないため、もっぱらゲームパッドの振動などを利用することになると思います。
Version 2.5で振動ゲームに対応しました。作者によるプレイで、ゲーム画面を見ずに、音も聞かずに、ゲームパッドの振動と、NVDAの点字ビューアーを見て、最初のボスの討伐に成功しています。盲ろう者の方がプレイしたとの報告は今のところありません。振動ゲームをまとめたサイトなどがあれば、投稿して宣伝したいのですが、見つかりませんでした。

## オーディオの振動出力機能
オーディオの音圧をゲームパッドの振動に変換して出力する機能です。個々の効果音の区別は難しいですが、何かが起こっていることはわかります。

<iframe width="560" height="315" src="https://www.youtube.com/embed/afr63NiaWU0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

## NVDA点字出力機能
NVDAに文字列を渡すだけで、自動で点字に変換してくれるので、対応はそれほど難しくないです。私は点字ディスプレイを持っていないので、点字ビューアーという機能を使って動作確認しました。

NVDAの点字ビューアーを使っている画像です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1225028/15a9572f-78e5-8ac6-cd88-82931e8c0e37.png)

## 読み上げのモールス出力機能
テキストをモールス信号や体表点字に変換してゲームパッドの振動として出力する機能です。実装がかなり大変だった割には、オーディオの振動出力機能と競合してしまったり、使い勝手はあまり良くないです。ゲーム内に実装するよりは、可能ならOSのボイスとしての配布を目指した方が良かったかもしれません。

読み上げのモールス出力機能の動画です。

<iframe width="560" height="315" src="https://www.youtube.com/embed/N0w03nmk6Uo" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

# 身体障害者向け機能
身体障害者向け向けの機能としてはコントローラーの再マッピング、ロックオン機能が挙げられます。海外の新作ゲームはほとんどがキーコンフィグに対応しており、日本はアクセシビリティの面では遅れていると言われています。キーコンフィグは健常者にとってもあると便利なものなので、実装は大変ですがなんとか追加したい機能ですね。
作者によるプレイで、キーコンフィグを行い、片手でプレイできることを確認しています。アクションの数が多いので、設定は少し難しいかもしれません。
キーコンフィグはなくても外部ツールである程度なんとかできることは確かですが、オンラインゲームなどでは利用規約で外部ツールの利用を禁止しているものが多く、なかなか難しい状況です。

## コントローラーの再マッピング
Version 2.6でコントローラーの再マッピング機能を追加しました。Version 2.5でゲームパッドの振動に対応するために、旧InputManagerから新InputSystemに移行したのですが、そのせいでキーコンフィグがなくなってしまい、アクセシビリティとしては後退してしまいました。InputSystemは使いやすいとは言い難いですが、なんとかキーコンフィグが完成しました。割と細かく設定できると思います。私は使ったことがないのですが、有料のアセットのRewiredが使いやすいとのコメントをちらほら見かけます。検討してもいいかもしれません。

コントローラーの再マッピングウィンドウの画像です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1225028/dbfcfa63-a6cc-6c7b-5981-cb37a77ea2a2.png)

## ロックオン機能
このゲームはもともとヒットアンドアウェイが重要なアクション制の高いゲームとして作成しました。なので、Version 2.1のアクセシビリティアップデートを公開した時点でも、ゲーム性を損なうのではと考え、ロックオン機能は実装していませんでした。作者によるテストプレイでも、実際にロックオン機能なしの音のみのプレイで中ボスの撃破まで可能なことを確認しています。
アップデートのたびにちょくちょくテストプレイはしているのですが、そのときにマップの移動や武器の射程内への移動がストレスに感じられました。なので、特にユーザーからの要望は特になかったのですが、Version 2.3でShiftキーによるロックオン機能を実装しました。
カーソルキーとの同時押しでマップ移動を行うこともできます。それと同時に能動防御のアクションを実装し、それまでのヒットアンドアウェイの他に、その場で耐えるという別のゲーム性を模索してみました。
また、Version 2.6でロックオンボタンの長押しで敵から離れる機能を実装しました。魔法使いを操作するときに便利かと思います。

ロックオン機能の動画です。
<iframe width="560" height="315" src="https://www.youtube.com/embed/TwU1VJ2pv5g" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

# その他の機能
その他の機能として、ゲーム速度変更、多言語対応、検索機能、が挙げられます。

## ゲーム速度を変更する機能
Version 2.4でゲーム速度を変更する機能を実装しました。オンラインプレイの場合、クライアントはサーバーのゲーム速度と同じになります。オフラインプレイの場合、プレイ中にゲーム速度を変更できます。Unityの場合、Time.timeScaleを変更することで、簡単にゲーム速度を変更できます。

## 多言語対応
多言語対応は、あまりアクセシビリティの文脈で語られることは少ないのですが、オーディオゲームはまだまだ少ないので、多言語対応を行ってより多くの方に遊んでもらえるようにするのは、意味があると思います。
日本語と英語は自分で、ポルトガル語、ロシア語、韓国語、インドネシア語、ベトナム語はゲームファンの有志の方に、それ以外の言語は機械翻訳を使って翻訳しました。Version 2.7でGoogle翻訳が対応している108の言語全てに対応しました。ただ、一部の言語の翻訳がひどいとの意見を頂いており、Google翻訳のすべての言語が実用に足りうる翻訳精度ではないようです。
Unityはアラビア語に対応していないので、とりあえず右から左に表示するようスクリプトを作成しました。ただし、アラビア語は本当は双方向テキストで、非アラビア文字は左から右に表示するのが正しいです。今後の課題です。
また、翻訳に携わる方が増えるに従って、翻訳の更新の足並みが揃わなくなる問題が発生しました。そのため、Version 2.6で翻訳テキストをGoogleスプレッドシートからダウンロードして更新する機能を実装しました。思ったよりも簡単でした。これで翻訳テキストの更新が楽になったはず。
現在、多言語対応は自作のシステムで行っていますが、私は使ったことがありませんが、UnityではLocalizationパッケージを使っている方をよく見かけます。検討しても良いかもしれません。

## 検索機能
Version 2.7でマップの検索機能と銀行のアイテムの検索機能を実装しました。単なる便利機能かもしれませんが、アクセシビリティの面でも重要な機能かもしれません。このゲームでは1つのエリアは縦横10マスずつの合計100マスからなるのですが、この100マスから特定の施設を探すのはなかなか大変なのです。

マップ検索ウィンドウの画像です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1225028/6709a36c-0f80-dccd-d187-d4244a9d28c9.png)

# 今後の展望
ブレイン・マシン・インターフェースの技術の発展で、閉じ込め症候群(意識はあるが体が完全に麻痺している)の方が遊べる、ミニゲームがいくつかあるようです。今後はミニゲームを超えた、より大規模なゲームも登場するかもしれません。
https://www.cnn.co.jp/business/35023243-3.html

ゲームアクセシビリティについて、ゲーム開発者が個別に対応する以外の方法も模索されています。
ゲーム画面をAIで認識しゲームのテキストを読み上げる方法があるようです。
https://accessibility-tech.blogspot.com/2021/03/mars-vision.html
また、ゲーム機のエミュレータに読み上げ機能を統合した例もあります。
https://www.gamespark.jp/article/2019/12/28/95758.html

アクセシビリティ意識の高まりにより、海外では包括的なアクセシビリティを持つゲームが発売されてきました。日本はアクセシビリティの面では出遅れた感じですが、今後に期待です。
https://blog.ja.playstation.com/2020/06/10/20200610-tlou2/