前回までで、ゲームのシステムがほぼ出来ました。 自機を動かす事、敵を生成する事、攻撃する事、攻撃される事。 今回は、ゲームのスタートボタンとゲームオーバーの表示、そしてリセットボタンを作っていきます。
目次
ゲームスタートボタンの設置
今までは、Unityの実行ボタンを押すとゲームが開始されてました。 もし、作ったゲームを配布する場合だと、これはゲームを起動するとすぐにゲームが開始する事になります。 それはちょっと、プレイヤーとしてはイヤですよね。 だから、ゲーム起動とは別にゲームをスタートするためのボタンを設置していきます。
uGUIを使って、ボタンの作成
ボタンを作るために使うのが[uGUI]というものです。 Unityに標準で付いている文字などを表示出来るものです。 [Hierarchy]タブのどこでもいいので、右クリックします。 そして[UI]→[Button]をクリックします。 [Hierarchy]タブの中に[Canvas]と[EventSystem]が追加されています。 そして、[Canvas]の中に[Button]が追加されています。 これでButtonが追加されました。 しかし、位置と大きさがおかしくなっているのと表示されている文字がButtonとなっています。 これをもっと大きくして、位置を真ん中あたりにして文字を[GameStart]に変えましょう!!
位置の設定
位置は、Posx・Posy・PosZを0にすれば、真ん中になると思います。
大きさの設定
まずは、青枠で囲んだところをクリックします。 そして、[Scene]タブのところにある[2D]というやつをクリックします。 そうすると、Sceneが2Dの表示になります。 ボタンなどは、2Dなので2Dの表示にした方が見やすくていいです。 そして、赤丸で囲んだツマミをクリックしながら、右に動かします。 これで、ボタンの大きさが変化します。 好きな大きさに変えて見てください。 大きさを変えると、ボタンの位置がずれるので、最後にもう一度、ボタンの位置を真ん中に設定しておいてください。
文字の変更
次は、表示されている文字を変えましょう。 今「Button」と表示されているのを「Game Start」に変えます。 [Hierarchy]タブの[Button]のさらに中にある[Text]を選択します。 そして、[Inspector]タブのある[Text]の部分を変更します。 今、Buttonなのでこれを「Game Start」に変更します。 そして、Colorの部分で色を変えられるので好きな色に変えてみてください。 これでボタンが追加出来ました。
ボタンが押された時の処理の追加
次は、ボタンが押された時の処理を追加しましょう。 その前に、宇宙戦闘機のオブジョクトをPrefab化しておいてください。 そして、[Script]の中に[GameControl]ソースファイルを追加してください。 そして、その中にSButtonの処理を書きます。
using UnityEngine; using System.Collections; public class GameControl : MonoBehaviour { public GameObject GameStartBtn; public GameObject starFighterPrefab; public GameObject GameOverSet; public bool gameFlag; // Use this for initialization void Start () { gameFlag = true; } // Update is called once per frame void Update () { if (gameFlag == false) { GameOverSet.SetActive(true); } } public void GameStartButton() { Instantiate(starFighterPrefab); GameStartBtn.SetActive(false); } public void GameOverButton() { Application.LoadLevel("GameScene01"); } }
24行目から27行目が追加された部分です。 先ほどPrefab化した、宇宙戦闘機を生成するコードです。 宇宙戦闘機があるから敵が生成されるので、宇宙戦闘機がないと敵は生成されません。 なので、このボタンが押された時に生成するようにする事でゲームをスタートさせる事ができます。 また、[ GameStartBtn.SetActive(false);]でスタートボタンが押された時にそのボタンのが非表示にされる処理を追加しています。 このソースファイルを[Hierarchy]タブにある[Main Camera]に追加してください。
ボタンに処理を追加
スタートボタンがこの処理をしてくれるように指定しなければなりません。 ゲームスタートのボタンの[Inspector]タブの下にある赤枠で囲まれたところに処理を追加します。 赤線を引いたところを[Main Camera]にし、青線で引いたところをスタートボタンの処理を書いた部分を追加します。 そして、青線で引いたところをクリックします。 [GameControl]→[GameStartButton]を選びます。 これで、StartButtonに先ほどの処理が追加出来ました。 スタートボタンとわかるように、Buttonのオブジョクト名を変えておきましょう。 ここを変える事でオブジョクト名を変更出来ます。
CameraControlの処理変更
今までは、[Hierarchy]タブの中にあった宇宙戦闘機をカメラで追う設定でしたが、今回でPrefabから生成した宇宙戦闘機を追うというのに変わるため、 処理の内容も少し変える必要があります。
if (GameObject.Find("SciFi_Fighter_AK5(Clone)") == true) { Vector3 startVec = GameObject.Find("SciFi_Fighter_AK5(Clone)").transform.localPosition; transform.localPosition = new Vector3(differenceX, startVec.y + difference.y, startVec.z + difference.z); }
Prefabで生成したものには最後に[(Clone)]がつくようになります。 なのでその点を変えてえいてください。
リセットボタンの設置
次は、リセットボタンを作りましょう。 まずは、スタートボタンと同じようにリセットを作成してください。 ただ、もうcanvasは出来ているのでcanvasの中にボタンを作成するだけでいいです。 canvasを選択して、右クリックから[Button]を追加してください。 あとは、同じように作成してください。
リセットボタンの処理の追加
リセットボタンの処理を追加します。 先ほどのコードにもう書かれているのですが、 30行目から32行目が、リセットボタンの処理です。[Application.LoadLevel(
"GameScene01"
);]は、シーンの読み込みをするコードです。
ボクは、ゲームのシーン名を[GameScene01]にしたのでこの名前ですが、保存したScene名によって変わるので、 自分が保存したScene名にしてください。 19行目から21行目に書いたのが、ゲームオーバーになった時にこのリセットボタンが表示されるようにするという処理です。 先ほどのスタートボタンの逆です。 いつ、ゲームオーバーになるか、自機(宇宙戦闘機)に敵の弾が衝突した時ですね。 なので、宇宙戦闘機のソースファイルの中にその処理を追加します。
void OnTriggerEnter(Collider coll) { if (coll.gameObject.tag == "EnemyBullet") { Instantiate(Explosion, new Vector3(transform.position.x, transform.position.y, transform.position.z), Quaternion.identity); Destroy(this.gameObject); GameObject.Find("Main Camera").GetComponent<GameControl>().gameFlag = false; } }
ここで、[GameControl]内で宣言している[gameFlag]をfalseに変えています。 先ほどの、リセットボタンが出る処理が[if
(gameFlag ==
false
)
]の中にあるので、gameFlag がfalseの時に表示します。という意味なのです、 これで、自機に敵の弾があたった時に表示されるようになりました。 [GameObject.Find(“Main Camera”).GetComponent<GameControl>().gameFlag = false;]は、 [Main Camera]というオブジョクトの指定(GameObject.Find(“Main Camera”)) その中にある[GameControl]の指定(GetComponent<GameControl>()) そして、その中にあるgameFlagの指定です。
最初は、非表示に
リセットボタンは、最初は非表示にしておきましょう。 リセットボタンの赤枠で囲んだチェックボックスを外す事で非表示に出来ます。
まとめ
これで、スタートボタンを押してゲームが開始され、敵の弾が当たるとリセットボタンが出るようになりました。 次回は、細かな設定をしていこうと思います。 では。
コメント
お世話になります。
私もプログラミングの初心者なので、日々勉強させていただきております。
ありがとうございます。
一点うまくいかない事がございますので、ご教示いただけますと幸いです。
『Game Start』ボタンと『Reset』を設置し、どちらともうまく機能するのですが、『Game Start』ボタンを押す前から既にゲームが開始されてしまいます。
『GameControl』ソースは特に問題無い様で、エラーもございません。
何が原因となり得ますでしょうか。
どうぞよろしくお願い致します。
『GameControl』内のGameStartButton()が、Start()かどこかで呼ばれている可能性があります。
もう一度確かめて見てください。
ここにProjectファイルがあるので、DLして違いを見てみてください。
http://hiromart.com/blog/publish_3dshootinggame/
typoをみつけました > 宇宙戦闘機のオブジョクト
細かくてすみません >_<
コメントありがとうございます。
それぽいところ修正しました。
プログラミング初心者なので
大変ためになります。
ありがとうございます。
ボタンはプレハブ化するのでしょうか?
説明が省かれていましたので。
GameControlのスクリプトをMain Cameraに割り当てた後に
GameObjectを3つ割り当てるのも省かれているようですね。
31行目の("GameScene01")をそのまま
割り当ててしまってエラーが出て戸惑ったのですが、
(“GameScene01”)と書き込めばいいみたいですね。
今後とも参考にさせていただきますm(_ _)m
コメントありがとうございます。
指摘いただい通り、
> GameControlのスクリプトをMain Cameraに割り当てた後に
>GameObjectを3つ割り当てるのも省かれているようですね。
というのが抜けていました。
ただ、ボタンはPrefab化はしなくていいです。
[Hierarchy]上にある[GameStartBtn][GameOverSet]を指定して貰えれば大丈夫です。
記事も簡単ですが修正させていただきました。
こんにちは。個人で勉強につかわせていただいてます。
” " ”のHTML文字がソースコード上に乗っていてちょっとややこしかったです。
改善お願いします。
コメント、ご指摘ありがとうございます。
この記事に関して、指摘いただいた箇所の修正をしました。
他の記事に関しても、気付き次第修正していきます。