i-school - 3Dスライダーゲーム 発展2
発展2 ーカメラの自動切り替え機能の実装ー
 3.Stage ゲームオブジェクトを作成する
 4.AR Camera と Main Camera とをプラットフォームによって自動的に切り替える機能を実装する



 新しい学習内容は、以下の通りです。

 ・プラットフォーム依存コンパイル −プラットフォームに合わせて処理を変える機能−



3.Stage ゲームオブジェクトを作成する

1.設計


 現在はゲームの舞台となるフロアやペンギンなどのゲームオブジェクトなどはすべて最初から配置された状態でゲームが実行されています。
 
 AR の場合、平面を感知したあとに、これらのゲームオブジェクトを生成するようにしたいので、
カメラ以外のゲームオブジェクトについては、フォルダ役のゲームオブジェクトを新しく1つ作成して、その中にすべてのゲームオブジェクトを子オブジェクトとして配置するようにします。
カメラを除外しているのは、エディター環境と実機環境で、利用するカメラが MainCamera と AR Camera とで異なるためです。
 

2.Stage ゲームオブジェクトを作成し、ステージ関連のゲームオブジェクトをすべて子オブジェクトにする


 ヒエラルキーの空いている場所で右クリックをしてメニューを開き、Create Empty を選択します。
新しいゲームオブジェクトが作成されますので、名前を Stage に変更します。

 AR シーン用に、ゲーム内のステージ用のゲームオブジェクト群をすべて Stage ゲームオブジェクトの子オブジェクトにします。

 AR Session ゲームオブジェクト、AR Session Origin ゲームオブジェクト、MainCamera ゲームオブジェクト以外のすべてのゲームオブジェクトを
Stage ゲームオブジェクトの子オブジェクトにしてください

 その後、プレファブにしてください。ただし、まだヒエラルキーから削除はせずにおいてください

 最後に、MainCamera ゲームオブジェクトのスイッチを入れて、アクティブ状態に切り替えてください。


ヒエラルキー画像(参考画像。自分のヒエラルキーに沿って作業してください)


 以上でこの手順は完成です。


4.AR Camera と Main Camera とをプラットフォームによって自動的に切り替える機能を実装する

1.設計


 AR ゲームの場合、エディターでのデバッグだけではなく、実機(スマホ端末)でのデバッグが必須要件になります。
ただし、エディターでデバッグを行う場合には AR Camera のゲームオブジェクトを無効化したり、あるいは逆に
実機でデバッグを行う場合にはビルド前の前に MainCamera ゲームオブジェクトを無効化したりと、手間と作業が増えています。

 そこで、ゲームを起動した際に、どのプラットフォーム(ゲーム環境)でゲームを起動しているかに合わせて、
利用するカメラを自動的に切り替える機能を実装し、先ほどの手動でカメラの切り替えを行う部分を自動化します。
手間が省けるだけではなく、無効化し忘れ、有効化し忘れを防止することにもつながります。

 Unity にはプラットフォーム依存コンパイルという機能があり、こちらを利用することにより、起動しているゲーム環境に応じて
カメラを制御する処理を実装していきます。


2.CameraModeSwitcher スクリプトを作成する


 AR とエディター用のカメラを登録し、制御するためのスクリプトを作成します。
制御にはプラットフォーム依存コンパイルを利用しています。


CameraModeSwitcher.cs

<= クリックすると開きます


 スクリプトを作成したらセーブを行います。


3.<プラットフォーム依存コンパイル −プラットフォームに合わせて処理を変える機能−>


 Unityではプラットフォーム(PC、Androidなどの動作する環境)に合わせて処理を変更する機能があり、それをプラットフォーム依存コンパイルと呼びます。

    void Awake()
    {
# if UNITY_EDITOR
        arCamera.SetActive(false);
# elif UNITY_ANDROID || UNITY_IOS
        editorCamera.SetActive(false);
        stage.SetActive(false);
# endif
    }

 #if プラットフォーム名(Unityで定義されている)を指定することで、そのプラットフォームの場合のみ指定した処理を行うように設定できます。
また if / else 文と同じように #elif を追加する、あるいは else 文と同じように #else を追加することで別のプラットフォームの場合の分岐を作成できます。
そのため使用方法は通常のif文の制御と同様です。

 今回のケースでは、プラットフォームが UnityEditorの場合(PCも含みます)には、arCamera 変数に対して SetActive メソッドを実行するように記述しています。
プラットフォームが elif、つまり、UnityEditor 以外でゲームを実行している場合であり、かつ Andorid か iOS のプラットフォームの場合には、
editorCamera 変数と stage 変数に対して SetActive メソッドを実行するように記述しています。

 この機能を利用することにより、1つのメソッド内でプラットフォームに応じた処理を分岐して記述できます
今回は、Unity エディター(PC)においてゲームを実行した場合には、MainCamera ゲームオブジェクトを利用できる状態にし、
スマホ端末でゲームを実行した場合には AR のカメラを利用できる状態にしています。

 また、プラットフォームによって入力の方式が異なる場合にも適用することができます。
スマホとPCではキー入力の方式が異なるため、一概に1つの処理ですべてをカバーすることが出来ないためです。
そういったケースを想定して、こういったプラットフォームに依存した形式のコンパイル方法が用意されています。


<参考サイト>
Unity公式スクリプトリファレンス
プラットフォーム依存コンパイル
https://docs.unity3d.com/ja/2018.4/Manual/Platform...
XR-Hub 様
【Unity】プラットフォームごとに処理を変更する方法
https://xr-hub.com/archives/13648


4.CameraMoveSwitcher ゲームオブジェクトを作成し、CameraMoveSwitcher スクリプトをアタッチして設定を行う


 ヒエラルキーの空いている場所で右クリックをしてメニューを開き、Create Empty を選択します。
新しいゲームオブジェクトが作成されますので、名前を CameraModeSwitcher に変更します。

 先ほど作成した CameraModeSwitcher スクリプトをドラッグアンドドロップしてアタッチしてください。
インスペクターを確認し、変数が3つ表示されていますので、アサイン情報を登録します。

 EditorCamera 変数には、ヒエラルキーにある MainCamera ゲームオブジェクトをドラッグアンドドロップしてアサインします。

 ARCamera 変数には、ヒエラルキーにある AR Camera ゲームオブジェクトをドラッグアンドドロップしてアサインします。

 Stage 変数には、ヒエラルキーにある Stage ゲームオブジェクトをドラッグアンドドロップしてアサインします。
こちらはプレファブの方の Stage ゲームオブジェクトでありませんので、注意してください。


ヒエラルキー画像



インスペクター画像


 以上で設定は完了です。

 いずれのゲームオブジェクトもスイッチは入れた状態、つまりアクティブの状態にしておいてください。
スクリプトを使用して、利用しないゲームオブジェクトの方のスイッチを切るように制御を行っているためです。


5.ゲームを実行して動作を確認する


 まずはエディターでゲームを実行してください。
ヒエラルキーにある AR Camera ゲームオブジェクトが非アクティブの状態になれば、制御成功です。

 次は、ビルドを行って、実機にてテストを行います。
MainCamera ゲームオブジェクトが非アクティブの状態になり、カメラにステージが表示されなくなれば、制御成功です。
CameraModeSwitcher 内のコメントアウトを削除して Stage ゲームオブジェクトが非アクティブの状態になるかどうかも確認しておくといいでしょう。


エディターでの確認




  以上でこの手順は終了です。

 => 次は 発展3 −AR カメラのプレイヤー追従処理の実装− です。