見出し画像

Unityゲーム開発進捗:マルチプラットフォームの下準備

4月は、マリンスクールシミュレーターのPC版を作ってました。

作業の大半はゲームパッド用UIを既存のタッチ用UIとは切り離して新規に作ることでした。実に辛かった。

ゲームパッドで動くようにメニューを再構築


高解像度テクスチャ、遠方まで描画、SSAO、ブルーム…

なにかゲームをリリースするとして、単一プラットフォームで十分な利益を出す・知名度を上げるのは現実には難しいことなので、マルチプラットフォーム展開をしたいです。しかしアプリはリリースしてもしばらくアップデート作業があります。プラットフォームを増やしたらその手間も増えるわけで、可能な限りコストを抑えて実現しないといけないです。
それには事前の準備が必要です。
モバイル用プロジェクトとPC用プロジェクト、流用できる部分をどこまで増やせるか
※重厚なPC用プロジェクトをモバイル用にするのはほぼ不可能なので、軽めなモバイルゲームをPCにも出すという前提です

プラットフォーム判別で切り替えるべきもの


・モバイルでの代表例
タッチUI 、プライバシーポリシーやホームページへのURLリンク、タッチ操作用のTIPS,画質を犠牲にして低負荷にするオプション
・PCでの代表例
ゲームパッドUI、キーボードUI、高解像度化高コストに対応させられるオプション、ゲームパッド・キーボード用TIPS、規制解除機能

スマホ用の低解像度テクスチャは勝手に解像度を変えてくれるのでいいとして、規制は、たとえば肌色の多いキャラとか四文字まみれの テキストをとか。封印するか置き換える必要もあるでしょう。PCゲームのそれは モバイルよりきついことはまずないのでこだわり表現があるから戻したいところです。(ビルドデータに含まれるだけでアウトの場合は知らん)
操作説明は、[Bボタンを押す]などのテキスト差し替えは翻訳とあわせるとやばい手間そうです。

STEAMやコンシューマーまで想定すると、ファイル操作、独自の実績機能、スクリーンショット機能もつけ外しできるようにしたいです。
プラットフォーム一つ完成させてから他機種も作る、だとどこかで詰む可能性大なので、開発中に想定して切り替えられるようにしたいです。
膨大なコード。データベースのどこを直せば切り替えれるかはメモしておきたい。

プラットフォームを切り替えるには


プラットフォームを判別するには#if UNITY_xxxをつかいます。

    public class PratformSupporter : MonoBehaviour
    {
        public enum ItPlatform { PCConsole = 0, Mobile = 1, WebGL = 2 }
        [Tooltip("PCConsole=0,Mobile=1,WebGL=2 ")]
        public ItPlatform NowPlatform;
        void Awake()
        {
#if UNITY_STANDALONE_WIN || UNITY_XBOXONE
            NowPlatform = ItPlatform.PCConsole;
#endif
#if UNITY_ANDROID || UNITY_IOS

            NowPlatform = ItPlatform.Mobile;
#endif

#if UNITY_WEBGL

            NowPlatform = ItPlatform.WebGL;
#endif
        }
    }

プラットフォームを記録するNowPlatform変数を参照して、タッチ操作対応UI、パッド用UI、メニュー画面などの各オブジェクトをアクティブ・非アクティブを切り替えればマルチプラットフォーム対応が実現できます。
ネイティブの機能を使うSDKはたいてい自力で判別できるだろうからここからは除外していいでしょう。

ゲームパッドとマウス+キーボードを切り替える

ゲームパッドを繋いだらUIガイドがパッド用に、キーボード+マウスに触ったらキーボード用に変換してほしいでしょう。
InputSystem.Gamepadクラスで、ゲームパッドの接続を判別できます。

パッケージマネージャーからInputSystemをインポートしてから
using UnityEngine.InputSystem;
とやって
if (Gamepad.current != null) { USEPad = true; } else { USEPad = false;
です。

しかし、ゲームパッドを引っこ抜いてもtrueのままだった事が多く、あまり信頼できませんでした。
これじゃ逆に遊べなくなりかねん。。。
また、専用ドライバとかインストールせず完全に認識できるのはXBOXコントローラのみでした。
判別できない原因がわからないので、プラットフォームで判別してPCはゲームパッドのみ、モバイルではタッチ操作のみ、WebGLではキーボードのみと設定してあきらめました。

パッド用UIを作るコツ

マウス操作オンリーのゲーム性なら、当然パッド用UIはいらないです。
パッド操作を頑張ってタッチ操作にしたようなゲームの場合、タッチ(=マウス)操作をあとからパッド用に置き換えるのは、かなりの難題です。
初めからパッド優先でUIをデザインしないといけません。
タッチ操作は画面内にいくらでもボタンを置ける、画像とか別のUIをボタンの上に置くかUIを非表示にするだけでノンコードで操作禁止にできるのに対し、
パッドは一度に押せるボタンはせいぜい4個から10個、UIが画面になくても操作を受け付けてる、キャラ操作とメニュー操作を切り替える必要がある、それは当然コーディングするしか解決策はない…と縛りがメガ大きい。
特に画面に収まらないUI=スクロール操作が、置き換えが超難しいです。
この縛りで快適操作が可能なUIをデザインしておかないといけません。
ゲーム性によっては断念するしかないまであります。

オプションの項目一つ増やすだけで泣くほどの手間

標準のUIでもある程度はパッド・キーボード操作に対応はされてます。しかし市販ゲームの快適さには遠く及ばない。
パッドで疑似マウスカーソルを動かしてタッチUIを押させる手もあります。
しかし、アクションゲームはどうしてもコントローラのみで遊ばせたい。
そういうこだわりを持ってると、まあ苦しみます…

(というかアセットストアでゲームパッド対応のUI の見つけ方がわからない!絶対あるだろうに!?)

それはそうと、開発者モードとしてスクショ機能は必要です。iOSの申請には指定された実機では撮れない解像度(!?)の画像が必要で、STEAMの申請にはUIが非表示なイメージ映像・スクショがいるらしいです。UIの透明度を0にするオプションが不可欠です。


手動で切り替えないと無理そうなもの


モバイルだし URPを使う想定ですが、レンダーパイプラインのプリセットは手作業で切り替えます。(しかし影めっちゃ汚いですねURP…)
リッチなシェーダーに差し替えたい場合も、スクリプトで差し替えは難し面倒そうだし、モバイルのビルドに組み込まれたら容量が痛すぎるし、手動で切り替えのほうが安全な気がします。
他にも、一部のアセットにはプレイ中に設定切り替えができない(マニュアルにやり方が載ってない)ものもあるでしょう。
絶対忘れるので、どこをどう変えたかメモを残しましょう。


体験版用を作る

ついでに、PCで販売するための体験版用に機能制限も実装します。
レベル制限、スキル制限、行けるシーンの制限、テキストの書き換え、製品版への誘導。。。ゲームマネージャーかデータベースかどこかに、boolトグル一つで一括で切り替えられるようにしとけば。
さすがにモデルデータ削除などは元プロジェクトから離れすぎだからプロジェクト複製して手動で変えますが、ある変数に制限を付ける程度の簡単なものは製品版で仕込んでもいいはず。
当然、オブジェクト非表示や変数のロックをしても不具合を出さないように作れてることが前提です。

と言っても大変

そんな感じである程度流用可能な作りにできたら、プロジェクトをバックアップして複製して別プロジェクトにして、プラットフォームごとに特化して仕上ていきげます。

フォルダをリネームするだけ(2バイト文字禁止)


将来アップデートしたとき簡単に全プラットフォームに反映できる作りが理想ですが。特定のフォルダ差し替えるだけとか。
モバイルは、まあネイティブ機能を使わなければ変更なしで別プラットフォーム向けに両立して作れるでしょう。しかし、モバイル独自の広告機能はiOSとAndroidで細かく仕様が違ってたりするし(広告表示中に時間やBGMが止まる止まらないとか)、PC版でもSTEAM版には実績とかスクショとかの独自SDKを入れる手間があるし、ゲームジャンルによってはプラットフォーム・販売サービスごとの個別の規制とかあるしなんで。。。
んーまあ頑張りましょう。



この記事が気に入ったらサポートをしてみませんか?