の前に
Unityで作る「シューティングゲーム」26回目の今回は、前回に引き続きリプレイ管理を行います。前回はUnityの再生ボタンを押した段階ですぐに始まるのではなく、「Sキー」を押すことでプレイが開始されるプログラムを作成しました。 今回はゲームオーバーになった際に、再度「Sキー」を押すことでリプレイを実行するプログラムを作っていきます。
1,ゲームオーバーテキストの表示
前回、UI で Canvas の配下に「ゲームオーバー」のテキストを作成しています。 「PlayerController.cs」を立ち上げて、以下のコードを入力してください。
❶ 前回作成した「ゲームオーバー」のテキストを使います。まずは変数として宣言。Inspector からこの変数を指定するので、[SerializeField] を指定します。
❷ 作成済みのコルーチン型 Destroy()関数を改造します。 Destroy(gameObject);の前に、❶で宣言したゲームオーバーテキストを表示させます。
表示の方法は SetActive(true) ですね。
その後の待ち時間は、音の効果の微調整です。
無くても良いですが、このサンプルではちょっと残さないと音が寸断されてしまいます。
[SerializeField] GameObject gameOverText; //❶変数として宣言
IEnumerator Destroy()
{
Instantiate(Explosion,transform.position,Quaternion.identity);//済み
audioSource.PlayOneShot(playerSounds[3]); //記述済み
yield return new WaitForSeconds(1f); //記述済み
gameOverText.SetActive(true); //❷テキストを表示
yield return new WaitForSeconds(2f);
Destroy(gameObject); //記述済み
}
① inspectorから、「gameOverText」に前回作成した「gameOverText」をセットします。

これでPlayer のヒットポイントがなくなったとき、「ゲームオーバーテキスト」が表示されるか確認してみてください。
2,ゲームの管理
次は「ゲームオーバーテキスト」が表示された状態で、「Sキー」を押せば再度ゲームが始まるような動きを作ります。
前回作ったようなコードを作ればよさそうですが、そうした場合、残っている敵やデブリ、衛星が表示されたままになってしまいます。 ということで、現在のSceneを再度読み込む、というコードを記述したいと思います。
「GameManager.cs」を立ち上げて以下のコードを追加しましょう。
❸ Sceneを管理するには、「UnityEngine.SceneManagement」という NameSpace(名前空間)を指定します。
最新のUnityバージョンではクラス内で使用すれば、勝手に追加されるようですが、背景を理解しておきましょう。
NameSpace を指定すると、いちいち複雑なクラスを記述しなくても、Unityなどが事前に用意しているプログラムを使うことができます。
using UnityEngine.SceneManagement; //❸namespace を指定
続いて GameManager Class に追記
❹ 「SceneManager」が持つ GetActiveScene() という関数を使って、現座のSceneを呼び出し、Scene型の変数:thisScene に代入します。
❺ 同様に「SceneManager」か持つLoadScene() 関数を使って、❹で取得した Scene を発動します。発動するには名前を指定しなければなりません。
void Update()
{
if (!IsGame() && Input.GetKeyDown(KeyCode.S)) //記述済み
{
gameStartText.SetActive(false); //記述済み
}
if(gameOverText.activeSelf&& Input.GetKeyDown(KeyCode.S))
{
Scene thisScene = SceneManager.GetActiveScene(); //❹Sceneセット
SceneManager.LoadScene(thisScene.name); //❺Scene発動
}
if (IsGame())
{
//内部記述済み
}
}
ということで、Sキーを押すことで、もう一度シーンを呼び出してプレイをすることができます。
ここで気になるのが、前回作った「GameManager.cs」の IsGame()関数。 このままでもいいのですが、ちょっと修正します。
❻前回、ゲーム中の条件として、「ゲームスタート」または「ゲームオーバー」のテキストが表示されている、という内容にしました。
しかし今回のプログラムで、ゲーム前に「ゲームオーバー」のテキストが表示されることがなくなりました。 ということで、または以下を削除していしまいます。(失礼しました)
public bool IsGame()
{
if (gameStartText.activeSelf) //|| ❻gameOverText.activeSelf を削除
{
return false;
}
else
{
return true;
}
}
ということで、今回はここまで。
教室では実際に通って頂いての授業の他、ちょっとしたお困りごとに対するオンライン授業やオンラインサポートも行っております。
お困りごとのある方、ご興味がある方は、ぜひお問い合わせください。
お問い合わせは こちら から。
体験授業のお申込みは こちら から。
過去の作品はこちらから。
Vol.20までの作品は、下のVol.21 文末のリンクからどうぞ
Comments