【初心者Unity】5分で考えたゲームを作る~ブロック積み③~
▶
【Unity】3Dアクションゲームを作ろう!#7 ステージの作成(Skybox・落下判定)
▶
【Unity】3Dアクションゲームを作ろう!#8 ステージの作成(スイッチ・扉)
▶
【Unity】3Dアクションゲームを作ろう!#9 プレイヤーのHP管理
▶
【初心者Unity】JsonUtilityクラスでJSONを扱う方法
▶
【初心者Unity】スクリプトからコンポーネントを追加する方法
5分で考えたゲームを作る~ブロック積み③~
こんな感じのシンプルなゲームを作ってみるの第3回(最終回)です。
最後の仕上げとして、2つ目以降のCubeの自動生成、スコアの表示、カメラの移動、ゲームオーバー、コンティニューを作成していきます。
前回の記事はこちら↓
5分で考えたゲームを作る~ブロック積み②~
初回の記事はこちら↓
5分で考えたゲームを作る~ブロック積み①~
■スコア表示の作成
ブロックを何段積み上げたか表示するためのUIを作成します。
Hierarchyビューにて、右クリック → UI → Text を選択。
作成されたCanvasを選択し、Canvas Scalerの「UI Scale Mode」を「Scale With Screen Size」に変更します。
次にCanvasの子要素のTextを選択し、Rect Transform と Textコンポーネントの値を下図の様に設定します。
■2つ目以降のブロックの生成と、スコアをカウントする処理の作成
実際に積み上げたブロックをカウントする処理を作成します。
数えた数値を先ほど作成したUIに渡すことで、ゲーム画面に表示されるようになります。
追記箇所は以下の通りです。
・using UnityEngine.UI; を追加
・text変数、count変数の追加
・Start内でcountを1で初期化
・UIにカウントを表示を追加 (同コメント箇所を参照)
・Next()メソッドの作成
・Cubeが静止したら~のif内に、Next()の呼び出しを追加
抜けが無いように気をつけながらGameControllerに追記してみましょう。
最終的に以下のスクリプトになればOKです。
using UnityEngine; using UnityEngine.UI; public class GameController : MonoBehaviour { public GameObject prefab; public Material material; public Text text; private GameObject cube; private bool isStart; private int count; void Start() { isStart = false; count = 1; } void Update() { // 未スタート時、左クリックで開始 if (!isStart && Input.GetMouseButtonDown(0)) { isStart = true; // Cubeを生成 cube = Instantiate(prefab, transform.position, Quaternion.identity); } // スタートするまではUpdate内の次の処理に進ませない if (!isStart) { return; } // UIにカウントを表示 text.text = count.ToString(); // Cubeが静止したら if (cube.GetComponent<Rigidbody>().IsSleeping()) { // 色を変える cube.GetComponent<Renderer>().material = material; // 次のCubeを生成 Next(); } } void Next() { count++; // Spawnの位置を1上昇 transform.position = new Vector3(transform.position.x, transform.position.y + 1, transform.position.z); // 次のCubeを生成 cube = Instantiate(prefab, transform.position, Quaternion.identity); } }
追記が済んだらSpawnオブジェクトを開き、public変数のTextに、UIのTextオブジェクトをドラッグ&ドロップでアタッチしましょう。
ここまで出来たら、以下が正しく動作するか確認してみましょう。
・ブロックを積んだタイミングで、2つ目以降のCubeが生成されること
・UIにカウントが表示されること
うまく動いたら次に進んでください。
■カメラの上昇
ブロックを3段積むごとにカメラが上昇する処理を作成します。
GameControllerのUpdate()内に以下の処理を追加しましょう。(全部書くと重複箇所が多いので、追記部分のみ表示します。)
void Update() { /* ~省略~ */ // 3段おきに if (count % 3 == 0) { // カメラを上昇 Camera.main.transform.position = Vector3.Lerp(Camera.main.transform.position, new Vector3(Camera.main.transform.position.x, transform.position.y, Camera.main.transform.position.z), Time.deltaTime); } }
記述したら再生して、3段積むごとにカメラが上昇することを確認してみましょう。
■ゲームオーバーとコンティニュー
最後に、ゲームオーバーの判定とコンティニューの処理を作成します。
今回ゲームオーバーの条件は、「最新のブロックがスタート地点(Y座標が0)よりも下に落下したら」としました。
コンティニューの処理はシーンを再ロードすることで実現しています。
GameControllerのUpdate()内に以下の処理を追加しましょう。(やはり全部書くと重複箇所が多いので、追記部分のみ表示します。)
using UnityEngine.SceneManagement; /* ~省略~ */ void Update() { /* ~省略~ */ // Cubeが高さ0以下まで落ちたらゲームオーバーとする if (cube.transform.position.y < 0) { // 左クリックでコンティニュー if (Input.GetMouseButtonDown(0)) { SceneManager.LoadScene("SampleScene"); } } }
LoadScene()の引数にはシーンファイルの名前を文字列で指定しています。
デフォルトのSampleSceneから名前を変更している場合は、自身の環境のシーン名を指定してください。
記述したら、ブロックが崩れて落下してしまった後に、左クリックでゲームが再スタートされることを確認しましょう。
■完成
以上で今回のブロック積みゲームは完成です。
改めて動作確認をして、一通り問題なく動作することを確認してみてください。
■作り込むなら…
高く積み上げたブロックが崩れるシーンが割と豪快だったので、崩れ始めたらカメラを引いて全体が見えると良さそう。