2021年4月27日4 分

Unityで「シューティングゲーム」をつくろう!Vol.25

最終更新: 2021年5月4日

前回は効果音をつけて、ゲームにちょっとした臨場感をつけてみました。この先BGMをつけていきたいのですが、その為には「ゲームスタート」と「ゲームオーバー」を管理するシステムがあったほうがよさそうです。

今回と次回、2回にわたり「ゲームスタート」と「ゲームオーバー」の仕組みを作成していきます。

では早速作っていきましょう。

Step1:ゲームスタートテキストの作成

まずはゲームスタートテキストを作っていきます。

スコアテキストを作った時と同様、UIの「Text」を使用します。

①Hierarchy上の「Canvas」のなかに、Text を生成し、名前を「StartText」にしておきます。

②Inspector を立ち上げて各種パラメータを指定します。
 
 RectTransformコンポーネントから、Anchor Preset を縦方向:middle、横方向:center つまりどっちも中央にしておきます。

③PosX PosY とも 0 にして画面中央に配置します。

 Width(幅)を300、Height(高さ)を100に変更。

④続いてTextコンポーネントのパラメータ調整。

 Text には実際に表示される文字を記述。このゲームではS(StartのS)を押したときにゲームが始まるように指定したいと思います。

ということで「Game Start(改行)Press S Key」としました。

ここはどこのキーで始まるかを含め、各自任意に決めて頂いて結構です。

⑥文字のフォント、大きさ、配置、色も各自調整してください。

ポイントは「FontStyle」。デフォルトでは特定のフォントスタイルしかないので、アセットストアから取得しました。

アセットストアで[font]などと検索し、任意のものを取得しておくと、使えるフォントが増えます。

以下のようなイメージのテキストが出来上がりました。

今回は使用しませんが、次回のためにゲームオーバーテキストも作っておきましょう。

スタートテキストを複製して、名前とTextと配色のみ変更しました。

ステップ2:プログラムの修正

続いてプログラミングを記述していきます。

今回は改造部分が多いので気を付けて書きましょう。

GameManager.cs」を立ち上げて、以下のコードを記述します。

❶❷でステップ1で作成した「gameStartText」「gameOverText」をそれぞれ宣言。

❸ゲーム中かどうかを判定する関数です。

 ❶で宣言した「gameStartText」もしくは「gameOverText」いずれかが表示されていたらゲーム中ではない、つまり「false」を返す。

そうでなければ(どちらも非表示ならば)「true」を返す。

という関数です。

❹Start関数内では、SetActive(false)で「GameOverText」は非表示にしておきます。

❺Update関数内の処理です。

 ❸で定義したゲーム中かどうかを判定する関数を使って、ゲーム中ではなく、かつSキーが押されたら、

 ❼GameStartText を隠し、IsGame()がTrue になりゲーム中という扱いになります。

❻今まで記述してたUpdate関数内の処理を、if (IsGame()) の条件下に置きます。

このことでゲーム中ならば、敵やデブリなどが発生するようになります。


public GameObject gameStartText; //❶gameStartTextを宣言
 
public GameObject gameOverText; //❷gameOverTextを宣言
 

 
public bool IsGame() //❸ゲーム中かどうかを判定する関数
 
{
 
if (gameStartText.activeSelf || gameOverText.activeSelf)
 
{
 
return false;
 
}
 
else
 
{
 
return true;
 
}
 
}
 

 
void Start()
 
{
 
scoreText.text = "Score:"+score.ToString(); //記述済み
 
enemyAppPattern = 1; //記述済み
 
gameOverText.SetActive(false); ❹gameOverTextは隠しておく
 
}
 

 
void Update()
 
{
 
if (!IsGame() && Input.GetKeyDown(KeyCode.S)) //❺スタート条件
 
{
 
gameStartText.SetActive(false);    //❻ゲームスタート
 
}
 
if (IsGame()) //❼もしゲーム中ならば(内部記述済み)
 
{
 
if(enemyCount == 0 && enemyAppPattern <= 2)
 
{
 
StartCoroutine(CreateEnemy());
 
}
 
else if (enemyCount == 0 && enemyAppPattern == 3)
 
{
 
Instantiate(EnemyStationA);
 
enemyAppPattern++;
 
}
 
D = Random.Range(0, 2000);
 
if (D == 0)
 
{
 
CriateAsteroid();
 
}
 
else if (D <= 8)
 
{
 
CriateDebris();
 
}
 
}
 
}


最後はGameManager のInspectorを表示させ、宣言した変数にStartText、GameOverText、それぞれをセットします。

ではこれで起動させてみましょう。

Sキーを押すまでは何も登場せず、プレイヤーだけが動きます。

プレイヤーも登場させないようにするには、プレハブ化してあげればいいでしょう。

ということで今回はここまで。

次回はゲームオーバーからリプレイのシステムを作っていきます。


教室では実際に通って頂いての授業の他、ちょっとしたお困りごとに対するオンライン授業やオンラインサポートも行っております。

お困りごとのある方、ご興味がある方は、ぜひお問い合わせください。

お問い合わせは こちら から。

体験授業のお申込みは こちら から。

過去の作品はこちらから。

Vol.20までの作品は、下のVol.21 文末のリンクからどうぞ

Unityで「シューティングゲーム」をつくろう!Vol.21

Unityで「シューティングゲーム」をつくろう!Vol.22

Unityで「シューティングゲーム」をつくろう!Vol.23

Unityで「シューティングゲーム」をつくろう!Vol.24

    4