これまで、簡単なゲームをいくつか作成していきましたが、今回は「状態管理(ステータス管理)」を意識してゼロからゲームを作成していきます。初心者向けと言うことで、物凄く簡単な初歩的な流れです。
はじめに
今回作成するゲームは「ブロック崩し」ですが、ゲーム部分はサラッといき「メニュー」から「ゲーム」への遷移などを意識していきます。複雑なゲームほど様々な「状態管理(ステータス管理)」が出てきますが、今回はかなりシンプルな形で作成していきます。
ゲームの流れイメージ
簡単なイメージは下記のような感じです。「メニュー画面」があって「ゲーム画面」に移動して「終了画面」を表示する、これが目に見える部分です。「初期化」や「次へ(次のステージ)」は内部的な状態ですね。

Unityバージョン
Unityのヴァージョンは2020.3.19f1、テンプレートは2Dを利用していきます。プロジェクト名は「2DBreakoutStatus」としておきます。

ゲーム部分の作成
まずはゲーム部分の作成です。ブロック崩しゲームの作成方法は良く紹介されていて、初心者でも簡単に作れたりします(簡単なものであれば)。今回、この部分はサラッといきます。
ボールとバーの作成
まずは「ボール」と「バー」を作成。ヒエラルキーメニューで「2Dオブジェクト」→「スプライト」から「円」と「正方形」を追加。

それぞれ名前を「Ball」と「Player」にして、サイズと位置を下記のような感じで変更しておきます。

重力の影響を無しにして、ボールに対してバーの質量を十分に大きくしておきます。

ボールとバーのスクリプト作成
新規スクリプトを作成し、それぞれのオブジェクトにくっつけます。

Ballsスクリプトの中身は下記のように変更。ボールが動くスクリプトですね、ぶつかったら方向が変わるようにしてあります。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Balls : MonoBehaviour { float _speed = 7.0f; Rigidbody2D _rigidbody; Vector2 _velocity; void Start() { _rigidbody = GetComponent<Rigidbody2D>(); _rigidbody.velocity = Vector2.down * _speed; } void FixedUpdate() { _rigidbody.velocity = _rigidbody.velocity.normalized * _speed; _velocity = _rigidbody.velocity; } private void OnCollisionEnter2D(Collision2D collision) { _rigidbody.velocity = Vector2.Reflect(_velocity, collision.contacts[0].normal); } }
バー(プレイヤー)のスクリプトは下記のように変更、マウスの動きあわせてバーが動くようになります。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Player : MonoBehaviour { Rigidbody2D _rigidbody; void Start() { _rigidbody = GetComponent<Rigidbody2D>(); } void Update() { _rigidbody.MovePosition(new Vector2(Camera.main.ScreenToWorldPoint(new Vector2(Input.mousePosition.x, 0)).x, -4)); } }
ここで一旦動かしてみてボールが落ちてきて、バーがマウスで動かせてボールが跳ね返ればとりあえずOK。
壁とブロックの作成
次に壁を作成します。ヒエラルキーで「空のオブジェクト」を追加し、名前を「Walls」に。その中に「2Dオブジェクト」→「スプライト」→「正方形」を追加、名前を「TWall」にしてサイズと位置を変更、コライダーを追加。上の壁にします。

TWallをコピーして左壁と右壁も作成。

次に実際に壊すブロックを作成、「空のオブジェクト」を追加し、名前を「Blocks」に。中に「2Dオブジェクト」→「スプライト」→「正方形」を追加、名前を「Block」にしてサイズと位置を変更。

ブロックをプレハブ化して、複製。

下記のような感じにします。お好みで何個でも大丈夫です。

後はBlockと言う名前でスクリプトを作成してBlockプレハブにくっつけます。Blockスクリプトの中身は下記に変更。ぶつかったらオブジェクトが消えるようにします。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Block : MonoBehaviour { private void OnCollisionEnter2D(Collision2D collision) { Destroy(gameObject); } }
一旦、これでゲーム部分は仮完成。ボールがぶつかり、ブロックが消えればOK。次回からは実際にメニューからゲーム画面の遷移などを作成していきます。