本投稿は2024年9月時点の内容になります。アップデートにより変更となる場合があります。また環境によって違いがあると思いますのであくまで参考として、ご了承ください。
様々な書籍、ブログや動画を参考にさせていただきました。多すぎて一つ一つはお紹介できませんが感謝です。
初心者の自分がUnity ソフトウエアでゲームを作ってみました。とりあえずシンプルなものということでモグラたたきに挑戦です。ゲーム作ってみるかという感じになったときに、いいタイミングで某ゲームのイベントシナリオ内ミニゲームにモグラたたきが実装されていたのでUIとかエフェクトとか、諸々の仕様をぱくって参考にして作ってみましたよ。様々なHowToの中の選択肢のひとつとして、同じ初心者さんの参考になればよいです。
\ チェック /
目次
ゲームオーバー画面を追加します
前回作ったポーズのUIを再利用してゲームオーバーの画面を作っていきます。プレハブバリアントという機能を使っていきましょう
本記事のポイント
- プレハブバリアントを使ってみます
プレハブバリアントとは
プレハブバリアントは、一揃いの事前定義されたプレハブのバリエーションを使用したい場合に便利です。
プレハブバリアントは、基本と呼ばれる別のプレハブのプロパティを継承します。プレハブバリアントに行われたオーバーライドは、基本プレハブの値よりも優先されます。プレハブバリアントは、モデルプレハブやその他のプレハブバリアントなど、他のどんなプレハブでも基本として持つことができます。
Unity マニュアル
プレハブの微妙なバリエーション違いを作成するのに便利な機能です。普通のコピペと違うのはプレハブなので編集の利便性がいいです。
元のプレハブを維持しながら、バリエーションを加えたいときはバリアントを編集(オーバーライド)、ベースを変更したい場合は元のプレハブを編集することで、バリアントにも変更が行われます。
ざっくりなイメージだと立ち食いそばで、オーバーライドはトッピング、ベースの変更は元となるかけそばの汁やそば自体をリニューアルする感じですかね。
プレハブバリアントを使ってみる
ゲームオーバー画面をプレハブとプレハブバリアントで効率よく作成していきます
ゲームオーバー画面は、前回実装したポーズ画面と構造が似ているので再利用しようと思います。
ゲームオーバー画面の実装例(その1オブジェクトの準備)
- 再利用するポーズ画面の「PauseUI」をプレハブ化します。
- プレハブバリアントを作成します。プロジェクトの「PauseUI」プレハブの上で右クリック>「作成」>「プレハブバリアント」
- もしくはヒエラルキー上の「PauseUI」プレハブをプロジェクトにドラッグアンドドロップでも作成できます。
- 作成したプレハブバリアントの名前を任意で変更します。今回は「GameOverUI」としました。
- ダブルクリックして編集モードにして変更を加えていきます。
- 「Label」に変更を加えます。
- テキストの載る部分にリボン素材を追加。
- TextMeshProの名前を変更し、テキスト内容を「RESULT」にしました。フォントサイズも微調整します。
- 「CloseIcon」のコンポーネントのスクリプトを削除します。
- ヒエラルキー上にプレハブバリアント「GameOverUI」を配置します。
- アサイン外れをチェックして、あれば再度設定します。
\ 前回作ったポーズ画面はこちら /
ゲームオーバー用のスクリプトを書いていきます。
ゲームオーバー画面の実装例(その2スクリプト)
- スクリプトを追加変更していきます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameOverUIController : UIController
{
public override void InitUI()
{
GameManager.Instance.GameOverUIController = this;
base.InitUI();
}
}
スクリプトざっくり解説
- スクリプト「GameOverUIController」を作成
- プレハブ編集モードで「PauseUIController」を削除して、「PauseUIController」をアタッチします。
public class BattleManager : MonoBehaviour
{
//省略
//Enemyターンの戦闘
public void EnemyTurn(Enemy enemy)
{
int playerHp;
playerHp=_player.CurrentHp;
EnemyStatus _enemy = enemy.EnemyStatus;
_enemy.Attack(_player);
if (playerHp > _player.CurrentHp)
{
//プレイヤーの生死判定
CheckPlayerDead()
}
}
//プレイヤーの生死判定
public void CheckPlayerDead()
{
if (_player.Status.HasFlag(Statuses.Dead))
{
//死亡していたらゲームオーバーの処理を実行
GameManager.Instance.UpdateCurrentState(GameState.gameover);
}
}
//省略
}
スクリプトざっくり解説
- (13-17)BattleManagerのEnemyTurnにプレイヤーの生死判定を設けます。
- (21-27)プレイヤーが死亡していたらゲームオーバーの処理を行います。
「GameManager」にも変更を加えます。
public class GameManager : Singleton<GameManager>
{
//省略
public GameOverUIController GameOverUIController { get; set; }
public void UpdateCurrentState(GameState newGameState)
{
CurrentGameState = newGameState;
switch (newGameState)
{
//省略
case GameState.gameover:
GameOver();
Time.timeScale = 0f;
break;
default:
throw new ArgumentOutOfRangeException
(nameof(newGameState),newGameState, $"UpdateCurrentStateにて予期せぬステート{newGameState}が指定されました");
}
}
//省略
private void GameOver()
{
GameOverUIController.OpenUI();
}
}
ゲーム再生してみます。ライフがなくなるとゲームオーバー画面が開いたと思います。
ただ、ゲームオーバー画面の後ろに敵のオブジェクトが残っています。気になるのですべて破棄します。敵のゲームオブジェクトを親オブジェクトの「EnemyManager」配下にまとめていたのが役立ちます。
ゲームオーバー画面の実装例(その3敵オブジェクトの破棄)
- EnemyManagerに以下のメソッドを追加して、ゲームオーバー時に実行します。
public void RemoveAllEnemies()
{
foreach(Transform _enemy in transform)
{
Destroy(_enemy.gameObject);
}
}
スクリプトざっくり解説
- Transformコンポーネントは、ループを使って子の Transform を使用する列挙体をサポートしています(Unity マニュアル)。これを使ってオブジェクト直下のオブジェクトを順に取得し、破棄します。
private void GameOver()
{
EnemyManager.RemoveAllEnemies();
GameOverUIController.OpenUI();
}
スクリプトざっくり解説
- 上記をゲームオーバーの処理メソッド「GameOver」から実行します
ゲーム再生してうまくいけばOKです
まとめ
まとめ
- プレハブバリアントとを使うと、元のプレハブを維持しながらバリエーションを作ることができてとても便利
- foreachとTransformも使うと、直下のすべての子オブジェクトをあつかうときに便利
\ 初学に使った書籍です /
動画×解説でかんたん理解! Unityゲームプログラミング超入門
大角 茂之/大角 美緒
おすすめ記事
Unity ソフトウエアでゲーム制作#1モグラたたき編(29.ゲームにBGM…
Unity ソフトウエアでゲーム制作#1モグラたたき編(28.ゲームに効果音…
Unity ソフトウエアでゲーム制作#1モグラたたき編(27.エフェクト2パ…
Unity ソフトウエアでゲーム制作#1モグラたたき編(26.エフェクトその1)
Unity ソフトウエアでゲーム制作#1モグラたたき編(24.Buttonで…
Unity ソフトウエアでゲーム制作#1モグラたたき編(23.シンプルなアニ…