Unityに関連する記事です

 ゲームの1サイクルを1フェーズとし、複数のフェーズをクリアすることでステージクリアとなるようにゲームの進行を設計します。

 またフェーズの区切りがわかるように、各フェーズの開始時に画面中央にゲームスタートの文字列をアニメ表示(Ready => GO!)するようにします。


<完成動画> 各フェーズの開始時に手球をスタート地点へ戻し、フェーズ情報を画面に表示する
https://gyazo.com/c81366f92a7a4e16c17d8f5f1766c60a



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

発展1 −フェーズ制の実装−
 1.Canvas 内の Top_UI ゲームオブジェクトの子オブジェクトとして PhasePlace を作成する
 2.UIManager スクリプトを修正する
 3.BattleManager スクリプトを修正する



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

・文字列の演算子について



1.Canvas 内の Top_UI ゲームオブジェクトの子オブジェクトとして PhasePlace を作成する

設計


 フェーズ制を考えたとき、現在が何番目のフェーズなのか、最後のフェーズは何番目なのか、という情報がゲーム画面に表示されていないと
ユーザーとしては、どこまでフェーズが進めばクリアになるのか、いまはどのあたりまで進んでいるのかが分かりません。

 これらをUIとして用意し、フェーズ数についてはUIManagerスクリプトを利用して、ゲームの進行状況に合わせて、現在のフェーズ数を更新して表示できるように修正します。

 この手順ではまず最初に、ゲーム画面にフェーズ数を表示するUI用のゲームオブジェクトの設置を行います。

 画面上部に表示したいので、Top_UI ゲームオブジェクトの子オブジェクトとして管理させます。


Canvas 内の Top_UI ゲームオブジェクトの子オブジェクトとして PhasePlace を作成する


 Canvas 内にある Top_UI ゲームオブジェクトの上で右クリックをしてメニューを表示し、Create Emptyを選択します。名前を PhasePlace に変更してください。
このゲームオブジェクトはフェーズ表示用のゲームオブジェクト群をまとめるフォルダとしての役割を担わせます。


PhasePlace ゲームオブジェクト ヒエラルキー画像



 位置については下記の画像を参考に、画面上部の左上にくるように配置してください。


PhasePlace ゲームオブジェクト インスペクター画像



PhasePlace ゲームオブジェクト Sceneビュー画像



PhasePlace ゲームオブジェクトの子オブジェクトとして、lblPhase ゲームオブジェクトを作成する


 PhasePlace ゲームオブジェクトの上で右クリックをしてメニューを表示し、UI => Text を選択し、名前を lblPhase に変更してください。
Text 用のプレファブを利用し、フォントなどを共有して使いたい場合には、作成せずに、プレファブを子オブジェクトとして配置してください。


lblPhase ゲームオブジェクト ヒエラルキー画像



 lblPhase ゲームオブジェクトは画面に常に [Phase] という文字を表示するための役割を持ちます。そのためゲーム中には文字の書き換えはありません。

 Textコンポーネント の Text 欄に Phase と入力し、文字の大きさや高さなどを、txtMoney の Text コンポーネントと合わせてください。
左右の文字の大きさが同じになることでバランスが良くなります。ここではフォントも同じにしていますが、それぞれ異なるフォントでも問題ありません。
 
 次の手順で、フェーズ数を表示させるTextをこのゲームオブジェクトの右側に配置しますので、画像のように少し画面左に寄せて配置してください。


lblPhase ゲームオブジェクト インスペクター画像



lblPhase ゲームオブジェクト インスペクター画像



lblPhase ゲームオブジェクト Sceneビュー画像



PhasePlace ゲームオブジェクトの子オブジェクトとして、txtPhaseCount ゲームオブジェクトを作成する


 PhasePlace ゲームオブジェクトの上で右クリックをしてメニューを表示し、UI => Text を選択し、名前を txtPhaseCount に変更してください。
ここも、Text 用のプレファブを利用し、フォントなどを共有して使いたい場合には、作成せずに、プレファブを子オブジェクトとして配置してください。


txtPhaseCount ゲームオブジェクト ヒエラルキー画像



 txtPhaseCount ゲームオブジェクトは、現在のフェーズ数とクリアまでのフェーズ数を表示する役割を持ちます。そのため、ゲーム中で書き換わる場所です。

 Textコンポーネント の Text 欄に 1/3 のように、フェーズの現在値/クリア値 となるように記述してください。
そのまま、大きさと配置(位置と高さ)を、先ほどの lblPhase ゲームオブジェクトを基準に調整してください。フォントを変更する場合も合わせて変更しておいてください。

 調整が終了したら入力した値は削除して、この Text 欄は空白にしておいてください。ゲームの進行に合わせてフェーズ数を書き換えるためです。


txtPhaseCount ゲームオブジェクト インスペクター画像



txtPhaseCount ゲームオブジェクト インスペクター画像



txtPhaseCount ゲームオブジェクト Sceneビュー画像



完成画像



SceneビューとGameビューでの画像



 以上でフェーズ表示に関するUI部品の設置は完了です。


2.UIManagerスクリプトを修正する

設計


 画面の上部に、現在のフェーズ数とクリアまでに必要な最大フェーズ数の表示が追加されましたので、この値の更新を行う処理をUIManagerに行わせます。
フェース数表示の更新用メソッドを用意して、各フェーズの開始時にBattleManagerクラスからこのメソッド呼び出して、画面のフェーズ数の更新を行わせます。

 また各フェーズの開始時に、画面の中央のステージ情報表示欄(ゲームクリアやゲームオーバーと表示されるText)に、フェーズスタートの表示を行います。


UIManagerスクリプトを修正する


 フェーズ数を扱うTextコンポーネントへの紐づけが必要になりますので、新しく変数を用意して、後程インスペクターよりアサインして取得します。

 UodateDisplayPhaseCountメソッドを追加し、このメソッド内でフェーズ数の更新を行います。
 DispayPhaseStartメソッドを追加し、各フェーズの開始時に画面中央にスタートの表示を行い、フェーズの区切りを分かりやすく伝えるようにします。


UIManager.cs



UIManagerゲームオブジェクトを確認する


 UIManagerスクリプトの修正が終了したら、UIManagerゲームオブジェクトを選択してインスペクターを確認します。
txtPhaseCount 変数が新しく追加されていますので、同名のゲーオブジェクトをヒエラルキーよりドラッグアンドドロップしてアサインしてください。


UIManagerゲームオブジェクト インスペクター画像


 
UIManagerゲームオブジェクト アサイン後のインスペクター画像



<文字列の演算子について>


 変数をつなげて文字列にする場合、1行で書く以外にも += 演算子を利用してつなげていくことが可能です。
また文字列内に数字の入っている変数と文字列""を + をつけて一緒に記述する場合、ToStringメソッドを省略することが可能です。
  1. = 演算子を利用した場合
    txtPhaseCount.text = currentPhaseCount.ToString();
    txtPhaseCount.text += "/" + maxPhaseCount;       // <= "/" と + でつなげる場合、数字の変数につける ToStringメソッドを省略可能


1行で書く場合(変数内に文字列が含まれる場合には ToStringメソッドを省略できます)
    txtPhaseCount.text = currentPhaseCount + "/" + maxPhaseCount;  // 同様の理由で省略可能

 数字の加算処理以外に、文字列の加算処理にも += 演算子が利用できることを覚えておきましょう。
ただし、= 演算子だけにしてしまうと代入処理になってしまい、前の文字列の情報を失うので注意してください。


3.BattleManagerスクリプトを修正する

設計


 ゲームの自動サイクル化を行うために、1サイクルをフェーズという単位で区切り、それを複数回繰り返すゲームプレイを行えるように設計を追加します。
フェーズ数は任意を値を設定できるようにし、その値の数だけフェーズをクリアすることでゲームクリアとなるように変更をします。


BattleManagerスクリプトを修正する


 1回のゲームプレイで実行されるフェーズ数を設定するために、新しく maxPhaseCount 変数を1つ用意します。piblic修飾子で用意し、インスペクターから変更できるようにしています。

 新しくフェーズごとに必要な処理を行うPreparateNextPhaseメソッドを作成し、敵の生成処理やGameState をPlayにする処理をこちらに移します。
敵をすべて倒すごとに、このPreparateNextPhaseメソッドを呼び出すようにし、フェーズとフェーズを繋げていきます。クリア回数のフェーズ数になったら
このメソッドの代わりに、StageClearメソッドを呼び出すように制御をしています。

 Startメソッド、Initializeメソッド、CheckRemainingEnemiesメソッドに処理を追加・修正して、PreparateNextPhaseメソッドに合わせたフェーズ制用の機能を実装します。


BattleManager.cs

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



BattleManagerゲームオブジェクトを確認する


 BattleManagerスクリプトの修正が終了したら、BattleManagerゲームオブジェクトを選択してインスペクターを確認します。
MaxPhaseCount 変数に1回のゲームプレイのフェーズ数を設定します。まずは 3 としてください。
この設定の場合、3回フェーズをクリアすることで、ゲームクリアとなります。


BattleManagerゲームオブジェクト インスペクター画像



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


 ゲームを実行して、最初のフェーズが開始されるか確認しましょう。確認ポイントは複数ありますので、下記にまとめます。


検証動画 ゲーム開始時(スタート演出前には画面をスワイプしてもキューライン生成されないので、手球は弾けない)
https://gyazo.com/0595807913dd9439fabc144967381793


_萍椋絃紊離侫А璽鎖瑤、フェーズが進むごとにちゃんと現在のフェーズ数に更新されているか(画面左上にフェーズ数が表示されないと問題)

各フェーズの開始時に手球はスタート位置に戻っているか(スタート位置に戻らないと問題)
 また残り時間は一旦停止するか。スタート演出後には、再度時間が動き出すか

3謄侫А璽坤好拭璽箸里燭咾法Ready => GO! のゲームスタート用画面の演出が挿入されるか(演出が出ないと問題)

検証動画 ↓◆↓
https://gyazo.com/f9d0456e86104a26408760d0874c3acf


ぅリア回数になってフェーズをクリアしたら、画面にステージクリアと表示され、リザルポップアップも表示されるか(ステージクリアにならないと問題)

検証動画
https://gyazo.com/5669d476d2e86e8068e8bfefb5ddb7fb


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

コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

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

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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