バーチャルキャストの設定画面を支える技術

ユーザーにjsonファイルを書かせるという"強い"設定方法

こんにちは。バーチャルキャストクライアント開発の穴うなぎです。
今年の春頃のアップデートでバーチャルキャストの設定画面は大幅に拡張されました。
このアップデートにより、以前はjsonファイルを直接書き換える必要があった設定を設定画面で簡単に変更できるようになりました。今回はそんな設定画面やconfig.jsonにまつわるお話です。
実はこの設定画面、開発者が設定項目の追加を効率よく行えるよう様々な工夫が仕込まれているのです。今回は設定画面にどのような工夫がなされているかをご紹介します!

なお、この記事はUnityで設定画面を作っている・作りたい人を読者として想定しております。

一つのソースから何もかも自動生成したいという思い

設定項目を新設するには、新たにコードを記述する必要があります。例えば、ランタイムでアクセスできる値を保持するクラスや、値を永続的に保持したり外部から書き換えるためのクラスに新しい設定項目に対応する記述を追加する必要があります。これらのコードを書く作業は定型的になるため、省力化の余地があります。
バーチャルキャストクライアントのプロジェクトにはこれらの作業を自動で行い、設定項目を追加する際の開発者の作業量を減らす仕組みが備わっています。

ソースとなるyamlファイルに設定の定義を記述し、その定義を基にEditor上でコードを生成します。
このyamlファイルには「設定項目とメタデータ(型、デフォルト値、利用可能なエディションなど)のリスト」を記述します。このyamlファイルの変更はAssetPostprocessorによって監視しています。変更が検出されるとコードジェネレータが走り、設定項目をランタイムで使用するためのコードが生成されます。
この「yamlファイルによる設定定義およびコード自動生成」の詳細については別記事で解説する予定です。

設定画面


この設定画面もyamlファイルを基に生成される自動生成コードによって構築されています。
設定画面は主に「UIパーツをインスタンス化するBuilderクラス」と「Builderに指示をするDirectorクラス」のふたつで構成されています。
Direcotrクラスはyamlファイルに定義された設定項目のメタデータを基に、使用するUIパーツや設定画面上の階層が決定されてEditor上で自動生成されます。
そして、ランタイムではDirectorクラスはUIにまつわるパラメータをBuilderクラスに渡し、Builderクラスは受け取った引数に応じてUIパーツのインスタンス化と初期化を行います。

いろいろなUIパーツ
UIパーツは

  • チェックボックス
  • 1行のテキストボックス
  • 複数行のテキストボックス(文字列のリスト用UI)
  • 2列複数行テキストボックス(文字列の組のリスト用UI))
  • スライダー
  • セレクトボックス
  • タグフィールド(短い文字列のリスト用UI)

が実装されています。
これらのUIパーツは設定項目のメタデータによって決定されます。
型がstring[]であれば「複数行のテキストボックス」となり、型がintfloatで最大値・最小値・ステップ値を持っているなら「スライダー」となります。
開発者はこれらのUIパーツを直接触ることなく、yamlファイルの編集のみで設定を設定画面に出現させることができるようになっています。

設定項目のメタデータを社内で共有する

社内共有用のスプレッドシート

バーチャルキャストにはコンシューマーエディション、ビジネスエディション、エンタープライズエディションの3種類のエディションが存在します。各エディションでどのような機能が使えるのか異なるため、営業担当者から「それぞれのエディションでどの機能が使えるのか知りたい」という要望が上がりました。
そこで、設定項目のメタデータをエンジニア以外が参照できる形でクラウドにアップロードする機能を作りました。yamlファイルには「どのエディションで使用できるか」という情報を設定項目のメターデータとして持っています。yamlファイルのパース結果をGoogleAppScriptで作成したWebAppにPOSTし、整形してSpreadsheetに保存するようにしました。
「どのエディションでどの機能が使えるか」がまとまったドキュメントは存在していましたが、クライアント側で使用できるエディションが変更されることへの追従ができていませんでした。定義ファイルがSSOTとなることで、正確な設定項目の情報を社内で共有することが可能になりました。

まとめ

今回はバーチャルキャストの設定画面の裏側をご紹介しました。設定項目の追加という作業は定型的ですが作業量は肥大化しがちです。単一のファイルに定義された情報からコードの自動生成やクラウドへのアップロードを行うことで、開発者の作業効率化が見込めます。また、開発者が容易に設定画面に項目を追加できる様になったことで、ユーザーはjsonファイルを編集せずに済むようになり、人間にやさしいプロダクトに一歩でも近づけたのではないでしょうか...。
この記事がUnityで設定画面を作る方々の参考になれば幸いです。