i-school - 3Dレールガンシューティング 発展27
 ゲーム内に時間経過の機能を追加します。
この機能を追加することにより、時間の増減を行うアイテムなどの要素を新しく追加することも出来るようになります。


<実装動画 今回は Enemy 用のゲームオブジェクトを破壊すると、GameTime 変数が加算される。>
動画ファイルへのリンク



発展27 ーゲーム時間機能の追加ー

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

 ・1つのスクリプトを異なる機能として利用する例
 ・UI の作成と連携の実装に挑戦する



1.設計


 ゲーム内に時間の概念を導入するための設計を検討します。 

 通常のゲームにおける時間の概念の場合、1つのメインゲーム内の時間を計測し、タイムアップの機能を使うケースがあります。

 レールガンシューティングにおいては、常に時間の計測をしている必要があるか、まずは考えてみてください。

 プレイヤーの移動についてですが、プレイヤーは各ミッションが終了するまでは移動が発生しません。
そのため、任意のタイミングでの移動を行うことが出来ません(プレイヤーに主導権はない)ので、この部分を計測する必要はないと考えられます。

 その代わり、各ミッションにおいてはエネミーや障害物となるギミックが出現し、それをクリアできなければ次の地点へは移動できません。
この各ミッション部分においては、時間の概念を取り入れることにより、決められた時間内にミッションをクリアする、という制限を与えることが出来ます。

 例えば、ミッションの開始時に 60秒という残り時間が与えられ、その時間内にミッションをクリアする条件を満たされなければゲームオーバーになる、という機能が実装出来ます。

 ミッション内の時間は、各ミッションごとにリセットさせてもよいでしょうし、すべてのミッションで共通の値を利用してもいいでしょう。
当然ながら、すべてのミッションで共通する値を利用する方がゲームの難易度は上がります。前回のミッションで残り時間が 10秒であったときに、
次のミッションではまた 60秒からミッションにチャレンジできるのか、10秒からのミッションスタートとなるのか、ゲームプレイに関してもかなり大きな制限となりえます。



 以上のことから、ゲーム内に新しい機能ー今回であれば時間の概念ーを取り入れていく、ということは、
その機能があることによって、どういったことがゲーム内で再現できるようになるかを考える 、ということにもつながります。

 残り時間が一時停止したり、時間の減少がゆっくりになったり、時間を延長したり、という風に、機能に関しての展開も考えることが出来るでしょう。
それをアイテムとして登場させて利用するのか、エネミーを倒すごとに時間が延長になるのか、どの部分に紐づけていくかも検討していく必要があります。



 いままでと同じように、教材を見る前にまずは 自分でどのような処理を組み合わせていけば、時間経過のロジックを構築することができるかを考えてみてください
イメージが浮かんだらそれをノートなどに書き出して、処理の繋がりを作ってみましょう

 設計力や実装力を養う訓練になりますので、難しい内容にはなりますが挑戦していただくことをお勧めします


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


 GameTimeManager ゲームオブジェクトにアタッチし、ゲーム内に時間の概念を取り入れ、制御を行うためのスクリプトになります。


GameTimeManager.cs

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



3.GameTimeManager ゲームオブジェクトを作成し、GameTimeManager スクリプトをアタッチする


 ヒエラルキーの空いている場所で右クリックをしてメニューを開き、Create Empty を選択して新しいゲームオブジェクトを1つ作成します。
名前を GameTimeManager に変更します。先ほど作成した GameTimeManager スクリプトを GameTimeManager ゲームオブジェクトにドラッグアンドドロップしてアタッチします。


インスペクター画像



 インスペクターを確認してください。
GameTime 変数と GameManager 変数が表示されていますので、順番に設定します。

 GameTime 変数にはミッション内の制限時間を設定します。仮に 60 で設定してください。
この部分は自由に調整してください。

 GameManager 変数には GameManager スクリプトの情報を登録しますので
GameManager スクリプトがアタッチされているゲームオブジェクトをドラッグアンドドロップしてアサインしてください。
自動的に GameManager スクリプトの情報が変数に登録されます。


設定後のインスペクター画像



 以上で設定は完了です。


4.TimeDetailを作成する


 時間の管理を行うスクリプトが完成しましたので、サンプルに1つ、時間の増減をおこなう機能を考えてみます。

 以下のような、ゲーム時間の増減を行う機能を持つスクリプトを作成します。
このスクリプトがアタッチされているゲームオブジェクトを破壊した場合には、
ゲーム時間の増減が発生するように機能させます。


TimeDetail.cs

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



*5.Enemy 用ゲームオブジェクトに TimeDetail スクリプトをアタッチする


 先ほど作成した TimeDetail スクリプトをゲームオブジェクトにアタッチすることにより、
どのゲームオブジェクトであっても、破壊された際にゲーム内の時間を増減するという機能を付与できるようになりました。

 今回はまず試作として、Enemy 用ゲームオブジェクト(Prefab でも、ヒエラルキーにある Enemy 用ゲームオブジェクトでも構いません)に
TimeDetail ゲームオブジェクトをドラッグアンドドロップしてアタッチください。

 その後、ゲームオブジェクトのインスペクターを確認し、TimeDetail スクリプトの TimeValue 変数に任意の値を設定してください。
プラスであれば時間が増え、マイナスであれば時間が減ります。


インスペクターのサンプル画像



 以上で設定は完了です。

 デバッグを行い、時間の増減機能の確認が出来たら、他のゲームオブジェクトにも運用していきます。


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


自分で書いた処理の見直しをして、処理の内容が説明できるか、スクリプト内に日本語でコメントを書いてみてください

 その後、処理の全体像を理解した上で、デバッグを行い、時間の計測機能がすべて実装されて正常に制御されているかを確認します。
事前に処理の見直しを行っているのは、どういった処理の制御が行われていれば正常であるのか、理解をした上でデバッグをおこなえるようにするため です。

 プログラムは書いた人が最後まで責任を持つ必要がありますので、書いて終わりではなくて、
自分の書いた処理がどのように動いてるのか、それは正常な制御なのか、間違っているのか、その判断をつけられるように
しっかりとスクリプトを読み解いていくようにしてください。

 ここでは確認項目については省略しますが、「実装した機能はすべて正常に動作している」と
自分で制御の良しあしの判断を付けてデバッグしてください

 以下に参考用のデバッグの内容を項目として掲載しておきますが、
今後はこういった内容もすべて自分で考えて用意してからデバッグを行う必要がありますので、
まずは1人でどういった内容をチェックし、正しい処理、間違っている処理の見分けを付けてください。


<デバッグ用のチェック項目(参考用)>

<= 自分で考えたデバッグの項目と照らし合わせて利用してください。


 すべての項目で問題がなければ制御成功です。

 問題があった箇所については、原因の特定について問題点の切り分けを行い、解決できるようにチャレンジしてください。


7.時間の概念についての運用を考える ー1つのスクリプトを異なる機能として利用する例ー


 処理が問題なく機能したら、Enemy ゲームオブジェクトに対して、破壊時に時間の増減機能を付与したいのであれば
そのまま TimeDetail スクリプトをアタッチしたままにしておいてください。

 Enemy ゲームオブジェクトには不要であれば、TimeDetail スクリプトは Remove してください。

 あとは、自由にゲームオブジェクトにアタッチして運用してください。

<運用例>
 ・民間人のゲームオブジェクトにアタッチし、マイナスの設定をしておくことにより、誤って倒してしまった場合に時間が減少するペナルティ機能を付与する
 ・アイテムのゲームオブジェクトにアタッチし、プラスの設定をしておくことにより、アイテム入手に合わせて時間が増えるボーナス機能を付与する。

 このように、作成したスクリプトは1つですが、運用する方法とゲームの世界観に沿った内容を設定することで、異なる機能として動作させることが出来ます。


8.<UI の作成と連携の実装に挑戦する>


 時間の概念についての実装は完成しましたが、これらは内部的な処理であるため、現時点ではゲーム画面上には時間の情報は表示されていません。

 いままで学習した内容を踏まえて、ゲーム画面上に時間の表示をする UI を作成してください。
配置場所、フォントなどの表示方法は任意です。ご自分のセンスで作成してください。

 その後、時間の値が更新されるたびに、ゲーム画面の時間表示も連携して表示が更新されるようにしてください。
UIManager スクリプトが UI の管理をしていますので、こちらと GameTimeManager スクリプトで管理してる時間の値を紐づけることで実装出来ます。

 設計から考えて、1人で実装にチャレンジしてください。



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

 次は 応用1 ーボスバトルの分岐例− です。