Unityに関連する記事です

 AR 用のデバッグ機能として、ゲーム画面上にログを表示する機能を実装します。


<実行動画 エディター>
動画ファイルへのリンク

 以下の内容で順番に実装を進めていきます。



手順3 ーログ表示機能の実装ー

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

 ・シングルトン・デザインパターンによるクラスの運用方法



4.デバッグを効率化するためのログの表示機能を追加する

1.設計

 
 AR は実機でテストを行う必要がありますが、エディターと異なり、Console ビューがないので、
Debug.Log メソッドを利用しても、実機にはログを表示することが出来ません

 このままでは不便なので、Console ビューの代わりに Canvas ゲームオブジェクトと Text ゲームオブジェクトを利用して、
ゲーム画面内に疑似的な Console ビューを作成し、ここに Debug.Log メソッドの内容を表示する機能を作成します。

 AR、VR などの実機でのテストが不可欠な場合には、こういったログ表示機能を事前に作成しておくことで、実機テストの際にデバッグの効率が上がります


2.Canvas_Debug ゲームオブジェクトを作成する


 ヒエラルキーの空いている場所で右クリックをしてメニューを開き、UI => Canvas を選択します。
Canvas と EventSystem が作成されますので、Canvas の名前を Canvas_Debug に変更しておきます。


ヒエラルキー画像




 Canvas を作成したら、CanvasScaler コンポーネントを確認し、Game ビューの解像度と同じ設定にしてください。

 UI Scale Mode を Scale With Screen Size に変更すると、Reference Resolution の項目が追加されますので、
こちらの Width と Height の値ご自分の Game ビューの解像度の設定に合わせてください。

 Scale Match Mode は Expand に変更してください。


インスペクター画像(Width と Height は参考値)



3.Canvas_Debug ゲームオブジェクトの子オブジェクトとして、txtDebug ゲームオブジェクトを作成する


 Canvas_Debug ゲームオブジェクトの上で右クリックをしてメニューを開き、UI => Text を選択します。
名前を txtDebug に変更します。txtLog などでもいいでしょう。


ヒエラルキー画像




 こちらのゲームオブジェクトのサイズがゲーム画面に表示するログ表示部分になります。
なるべく邪魔にならない位置に、ある程度の大きさで作成しておいてください。
たくさんのログが表示されるようにするためです。

 位置については例えば左上、左下、のように配置しておくといいでしょう。
その場合にはアンカーの設定も合わせて行うようにしてください。

 文字サイズ、フォント、 Outline などの文字装飾は自由に設定してください。
文字がにじんでしまう場合には Scale の各値を 0.3 位に下げてからフォントの値を大きくすると改善されます。

 画面のタップを阻害するため、Raycast Target のスイッチは切っておくようにしてください。


インスペクター画像(参考)



Scene ビュー画像(参考)



 サイズや位置の調整が済んだた Text プロパティの New Text の文字は削除しておきましょう。


4.LogDebugger スクリプトを作成する


 ログ表示を行うためのスクリプトを作成します。
シングルトンクラスとして作成しておくことで、いずれのクラスからでも自由にアクセスが行える状態にしておきます。

 外部のクラスから DisplayLog メソッドを実行してもらい、引数で文字列の情報を受け取れるようにしてあります。
それを txtDebug ゲームオブジェクトの Text コンポーネントを通じてログ表示を行います。


LogDebugger.cs

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


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


5.<シングルトン・デザインパターンによるクラスの運用方法>


 シングルトンとは、数多くあるデザインパターンの1つです。
そのクラスのインスタンスが必ず1つであることを保証するデザインパターンのことを言います。

 LogDebugger クラスでは、このシングルトンを採用しています。
つまり、ゲーム中を通じて、この LogDebugger クラスが1つしか存在できないようになります。
実装例は複数ありますが、一番読みやすい方式で記述しています。



<シングルトンデザインパターンのクラスの作成方法>
    public static LogDebugger instance;  // クラス名と同名の型を static で宣言する

    private void Awake() {
        if (instance == null) {
            instance = this;
            DontDestroyOnLoad(gameObject);
        } else {
            Destroy(gameObject);
        }
    }



 ポイントは、自分自身の LogDebugger 型を static 修飾子付きの instance 変数として宣言していることです。
この instance 変数が LogDebugger クラス自身が代入された情報として利用することになります。

 Awake メソッドを利用して、instance 変数が null (空っぽ) である場合には、LogDebugger クラス(this)を代入します。
次の DontDestroyOnLoad メソッドは Unity が用意しているメソッドで、引数に指定されたゲームオブジェクトはシーン遷移をしても破壊されてないゲームオブジェクトになります。
この DontDestroyOnLoad メソッドはシングルトンデザインパターンにする際に一緒に用いられることが多いです。

 そして instance 変数が null ではない場合、つまり、2つ目以降の複数の LogDebugger クラスが存在する場合には、その LogDebugger クラスのゲームオブジェクトを Destroy します。
この手順により、LogDebugger クラスがアタッチされているゲームオブジェクトが常にヒエラルキー上に1つしか存在しない状態を作り出しています

 このシングルトンによってインスタンスが1つか生成されないことが保証されますので、
逆説的に考えると、この LogDebugger クラスへの参照は、いずれのクラスからであっても変数を介さずに参照を行えるようになります。



 例えば、NonPlayerCharacter というクラスがあり、その NonPlayerCharacter クラスを持つゲームオブジェクトが5つあった場合、
どの」NonPlayerCharacter クラスであるかを確定できないと、対象となる NonPlayerCharacter クラスへは参照できません。
そのため、NonPlayerCharacter 型の変数を用意して、その変数へ参照したい NonPlayerCharacter クラスを代入することによって、
はじめて NonPlayerCharacter クラスの情報を扱うことができるようになります。これが情報を扱う際の基本的な処理になります。

 ですがシングルトンである LogDebugger クラスの場合には、このインスタンスは常に1つしかないことが保証されていますので、
どの」という指定の部分が不要になります。よってクラスの特定ができているため、変数への代入が不要になります。
LogDebugger という指定はすなわち、自動的にただ1つの LogDebugger クラスの参照が行われることになるためです。

 この機能を利用して LogDebugger クラスを作成しておくことで、どのクラスからでも参照しやすい設計にしておきます。


6.Canvas_Debug ゲームオブジェクトに LogDebugger スクリプトをアタッチして設定を行う


 Canvas_Debug ゲームオブジェクトに LogDebugger スクリプトをドラッグアンドドロップしてアタッチします。

 インスペクターを確認し、txtDebug 変数に同名のゲームオブジェクトをドラッグアンドドロップしてアサインします。
自動的に Text コンポーネントの情報が登録されます。


インスペクター画像



 以上でログ機能は完成です。
あとは、任意のクラスから DisplayLog メソッドを実行することで、ゲーム画面にログ表示が実行されます。


7.CameraModeSwitcher スクリプトを修正する


 前回の手順で作成した CameraModeSwitcher スクリプトを修正し、カメラの切り替え後のタイミングでログ表示させるようにします。

 特に実機でのテスト時には、エディターとは異なり、Console ビューがありません。
そこで、このログ表示機能を Console ビューの代わりに利用し、ゲーム画面にログを表示させることで処理の内容を確認していくことが出来ます。


CameraModeSwitcher.cs

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


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


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


 前回と同じように、エディターと実機の両方でゲームを起動し、デバッグを行います。

 ゲーム画面に、それぞれの設定した文字がログとして表示されれば、プラットフォーム依存コンパイルの処理が正常に動作している裏付けが出来ます。


<実行動画 エディター>
動画ファイルへのリンク



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

 => 次は 手順4 AR空間に画像付きのオブジェクトを生成する です。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3Dレールガンシューティング(応用編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます