第2回UnityでPinBallGame作成~上級編~
こんにちはパソコン教室えがおの加賀美です!!
9回目のブログ更新になります(*^^)v
前回「Unity」を使って簡単なピンボールゲームを作成し、オブジェクト(ボール、ブロック、プレイヤー)を作ってC#Scriptを作成し動かすまでを作成しました。
今回は上級編ということで、GameManagerやUIなどを勉強していきたいと思います。
- 今回学ぶ事
- GameManagerの作成
- ゲームクリアーの作成
- ゲームオーバーの作成
- UI(ユーザーインタフェイス)の作成

- GameManagerの作成
プロジェクトビューを右クリック ➡ Create ➡ C#Script
名前は「GameManager」とする ※アイコンが変わっても気にしない

「GameManager」をダブルクリックしてVisualStudioを立ち上げる
「GameManager」とはゲーム全体の管理者
・例えばブロックが消えたらすべてクリアとする
・ボールが1番下の壁に当たったらゲームオーバーにするなど
- 次にゲームクリアーの作成
ルールとしてブロックがすべて消えたらクリアーにする
まずブロックを格納する変数を作る。スクリプトを書いたら保存する

Unityに戻りからのオブジェクトを作成する(CreateEmpty)

CreateEmptyを作ったら名前の変更「GameManager」したらスクリプトをアタッチする。

インスペクターウィンドーのBlocks Sizeとある場所にすべてのブロック、Block~Block(9)までのオブジェクトをドラッグして入れ込む。
これでこの「GameManager」のスクリプトの中でBlockがすべてなくなったか判断できる。
スクリプトの [] は配列という意味
※配列とは複数の変数の集合体(セット)同じ方であれば入ることができる。
ブロックが全て消えた時にすべてゲームを終わらせたいゲーム中のブロックがあるか監視するのでVoid Update()の中に書く

次に関数を入れます
このゲームでしか使わないのでprivateで、帰り値は今回は「出来ている」と「出来てない」の2択なのでboolを使う。
※boolは「出来ている」と「出来てない」の2択 (trueかfalse)
関数名は「DestroyAllBlocks」とする
ブロックが全て消えていたら「消えている return.true;」「消えてない return.false;」

配列を入れてら必ず使うのがforeach(配列の中の各要素に対して命令ができる)
かっこの中のblocks分だけがループする

!=の意味・・・~ではない 逆に==の意味は・・・同じである
Nullの意味は・・・何もない
スクリプトの b!=nullとは・・・もしbがnullではない場合
ブロックが1個でもあれば実行されません。

関数が出来たらup dateの中にゲームクリアーの処理とゲームチェックするプログラムを書く

Debug LogとはUnityのコンソールにエラーなどを表示させる

出来たらゲームを実行させて確認をする。
- 次にゲームオーバーの作成
ルールとしてボールが1番下の壁に当たったらゲームオーバーにする
Ballスクリプトを開いて、何かの当たった時にプログラムを実行させる
他のスクリプトから呼ぶ関数を作るのでpublicとする。

このまま実行してしまうと何に当たってもボールが消える状態でゲームにならないので、1番下の壁だけに当たったらゲームオーバーとするように書く。
Unityに戻って1番下の壁をクリックし、Tag付けをする。
TagはFinishとする。ついでにオブジェクト名を「WallFinish」
このボールが当たったもののTagがFinishだったらゲームオーバーのプログラムが動くようにする。
Ballのスクリプトに追加する

Destroy(this.gameObject);の位置を変える
保存してUnityで実行する。

ボールが1番下の壁に当たっていることを伝えるスクリプトを追加する
ボールスクリプトに新しい変数を追加する

Unityに戻ってBallをクリックする
インスペクターウィンドーにMy ManagerがでてくるのでHieraichyのGameManagerをドラッグする(アタッチ)

そうすることによってGameManagerにBallがゲームオーバーになった時、ゲームオーバーだよと伝える役割になる。
- UI(ユーザーインターフェイス)を作成
GameObject ➡ UI ➡ Text


Positionは

Textの変更「GAME OVER」に

スケールを変更し中央揃え、色は白にフォントサイズは40に変更



ここでテキストが消えてしまった人は下記調整してください
Horizontal OverflowをOver Flowに変更
Vertical OverflowをOver Flowに変更
位置調整する

1つのCanvasが1個のUI(CanvasにUIを作っていく)

ボタンのオブジェクトを入れる
GameObject ➡ UI ➡ Button
Positionn変更

テキストを変更する「RETRAY」
ボタンのパラメーター変更

押された時のボタンを変更する
Pressed colorを好きな色に
On Click➡クリック時 変更
+を追加

HerarchyのGameManagerをドラッグする

そうすることによってGameManagerの関数を選ぶことが可能に
GameManagerのスクリプトと関数を追加する
他からも使うのでPublick

GameRetryの処理を書く
Gameシーンの再読み込みをさせる

Using UnityEngine SceneManagementをクリックするとエラーが消える

残りのスクリプトを書く

Buttonをクリック ➡ インスペクターウィンドーのOnClickのNoFanctionにGameManagerを入れ込む。

実行させて確認
UIを非表示にして名前を変える「UIGameOver」

次に1番下の壁に当たったら上のUI(GameOver)が実行されるスクリプトを書きます。
まず変数の作成

スクリプトを追加

SetActiveとは表示されているかされていないかを表す関数。
保存して実行して確認する。
GameManagerに戻るとGameOverUIが追加される。
そこに先ほど非表示にしたUIGameOverのUIをドラッグする。

実行して確認する。
- ゲームクリアーUIを作成
ほぼゲームオーバーUIと同じなのでUIGameOverを複製して名前の変更
「UIGameClear」に

Buttonはそのままにして非表示にする。
GameManagerスクリプトの変更
ここでもコピーする。

gameOverUI.SetActive(true);をコピーする。

貼り付けて(gameClearUI)に変更

ただこのままだとvoid Updateの中のスクリプトが永遠に繰り返されてしまう(無駄にPCに負荷が過かってしまう)ので少しスクリプトを追加します。
次に下記の青い部分を切り取って

下記に張るつける
If ( is GameClear != true)
↑まだゲームがクリアーしてない場合

Is GameClear = true;
↑の処理を一回でもしたら if の部分が呼ばれなくなるスクリプト。
これで無駄な処理がされなくなる。
Unityに戻りGameMnagerにGameClearUIが追加されているか確認する。
そこにUIGameClearをドラッグする。

最後保存して実行確認する。
以上で第2回UnityでPinBallGame作成の終わりです。
ここまで出来るようになれ簡単なゲームであれば作れると思います。
後は、自分用に作り替えたりデザインを変えたり工夫して自分なりのゲームを作って楽しんでください。