コンシューマゲーム機への移植


「宴」のコンシューマゲーム機対応に関して問い合わせが増えてきたこともあり、プラットフォーム依存にまつまわる問題について対応方法をまとめておきます。

コンシューマゲーム機対応において前提となる問題

まず、基本的には宴のサポートするプラットフォームは、PC(Windows、Mac)、Android、iOS、WebGLになります。
そして、コンシューマゲーム機には基本的には対応していません。
開発機材などを用意するのが難しいというのもあるのですが、コンシューマゲーム機の開発はNDA(秘密保持契約)というものを結ぶ必要があり、そもそも対応したプログラムを公開することが禁止されています。
つまり、コンシューマゲーム機用に開発したプログラムはAssetStoreやインターネット上で公開することができません。
Unityやコンシューマゲーム機の開発サポートへ問いあわせて確認しましたが、簡単なものであってもやはり禁止のようです。
なので、基本的には宴側で対応するには、各開発プロジェクト個別に受託開発の形で依頼していただき、各プラットフォームへの開発者登録を終えてNDAを結んだうえで個別に対応していく形にせざるをえません。
ただ、これは手間も時間もお金もかかってしまうので、かなり大変だと思います。特にインディー開発では現実的ではないと思います。

なるべく簡単な対応

基本的には、コンシューマ移植は各プロジェクト個別に対応していただくことになり、それに関してのサポートは規約上でもできません。
ただ、コンシューマゲーム機で「宴」をどう使うかによるのですが、対応自体は簡単な場合もあるようです。
把握している限りは、一部のUnityのクラスがコンシューマ機に対応しておらずにコンパイルエラーになったり、セーブデータの書き込みのためのファイルアクセスでエラーになる・・・などが主なエラーの原因のようです。
なので、NDAに抵触しない範囲・・・つまり、特定のプラットフォームへの対応というわけではなく、
各プロジェクトの開発者が任意に一部機能をコンパイル時点で無効化したり、差し替えたりできるような機能を追加しました。

プラットフォーム依存対策

Unityでは、「Scripting Define Symbols」に #define ディレクティブを追加することが可能です。Unityドキュメント
これを使って、宴内部でプラットフォーム依存になりがちな一部の機能をコンパイルの対象外にすることができるようにしました。
「宴」のVersion3.5.4以上が必要になります。

DefineSymbol 概要
UTAGE_DISABLE_VIDEO Unity公式のVideoPlayerクラス(動画再生クラス)を使った機能をコンパイルから除外し、コンパイルエラーとなる場合の対策とする
UnityがVideoに対応しているプラットフォームの場合は無効化しなくてよいので不要。
UTAGE_DISABLE_MOVIE Unity公式のMovieTextureクラス(動画再生クラス)を使った機能をコンパイルから除外し、コンパイルエラーとなる場合の対策とする
Unity2018.2以降ではMovieTexture自体が廃止されているので何もしなくても無効化される。
宴3.5.6以前は、UTGAE_DISABLE_MOVIEと、スペルミスした定義してしまっていたため、宴3.5.7からUTAGE_DISABLE_MOVIEに修正。
UTAGE_DISABLE_CACHING Unity公式のCachingクラス(アセットバンドルをDLした際のキャッシュ管理クラス)を使った機能をコンパイルから除外し、コンパイルエラーとなる場合の対策とする
UTAGE_DISABLE_FILEIO C#のSystem.IO系のファイルの読み書き機能の使用が禁止されている場合に、機能を無効化して、Unity公式のPlayerPrefsクラスを使う
UTAGE_DISABLE_APP_PATH Unity公式のApplication.persistentdatapathやdataPathへのアクセスを無効化する。
本来はセーブファイルの保存先のパスなどを取得するために使用しているが、コンシューマの場合は呼び出すだけでクラッシュすることがあるようなので、その対策

サンプル

上記全ての機能を無効化するのであれば、下記の文字列を「Player Settings」の「Other Settings」パネルの「Scripting Define Symbols」に記述してください。

UTAGE_DISABLE_MOVIE;UTAGE_DISABLE_VIDEO;UTAGE_DISABLE_CACHING;UTAGE_DISABLE_FILEIO;UTAGE_DISABLE_APP_PATH

ファイル書き込みクラスの差し替え

上記のUTAGE_DISABLE_FILEIOを使ってファイルの書き込みを無効化した場合は、代わりにUnity公式のPlayerPrefsクラスを使ってセーブデータの読み書きをします。
さらに、PlayerPrefsクラスも使わずにそれ以外の方法でファイルの読み書きを扱う必要がある場合は、ファイルIO用のコンポーネントを独自に実装したものに差し替えてくだださい。

サンプル

デフォルトではManagers>FileManagerオブジェクトに「FileIOManager」コンポーネントがあるので、「FileIOManager」コンポーネントを継承して処理を書き換えたコンポーネントに入れ替えてください。

上記のサンプルコンポーネントのソースコードは Utage\Sample\Scripts\SampleFileIOManagerCustom.cs にあります。

その他

このドキュメントは、あくまで実装の手助けとなる情報をまとめただけのものであり、コンシューマゲーム機での動作を保証するものではありません。
実際にコンシューマゲーム機で動作している例も何件か聞いていますが、断念した例もあるようです。特に古い携帯ゲーム機などでの低スペック環境では厳しいと思われます。

上記以外にコンパイルエラー対策で無効化したいコードなどがある場合、Q&Aなどにご連絡いただければ簡単なものであれば対応します。