【第9回】超入門!Unityで2D脱出ゲームを作ろう!「クリア判定編」

第9回クリア判定編
ゆくすぃ

ごきげんよう、Budding Lab.編集部のゆくすぃです!
ゲームの進化に改めて驚かされる日々ですが、その一方で、初期にやり込んだ理不尽なゲーム達にも思い入れがありますね・・・

ゲームが大好きな皆さんなら、一度は「自分でゲームを作ってみたい!」と、思ったことがあるのではないでしょうか?

本連載では、ゲーム開発初心者のゆくすぃが、基礎的なスクリプトだけを使って、超入門・2D脱出ゲームの作り方を解説します!

本記事は、第9回「クリア判定編」です。

プログラミングの専門知識がなくたって、画像や音楽作成アプリが使えなくたって、案外、ゲームって作れるものです。興味が湧いたなら、ぜひ挑戦してみてください!

目次

クリア判定の仕組み

今回作成するゲームのクリア条件は「お菓子を3つ入手すること」です。
それはつまり「InventoryにCandy4・Candy5・Candy6の画像がすべて表示されること」と、言い換えることができます。

クリア判定の仕組み

したがって、Candy4・Candy5・Candy6の表示・非表示を判定して、3つすべてが表示されていれば、脱出口(Exit)を表示する・・・という仕組みを作っていきます

クリア判定を実装する

スクリプトを書く

ProjectウインドウでScriptsフォルダを開いて「C# Script」を新規作成し、名前を入力して確定します。
ここでは「GameComplete」としました。

スクリプト:GameComplete」を開き、以下のように記述します。

1 using System.Collections;
2 using System.Collections.Generic;
3 using UnityEngine;
4
5 public class GameComplete : MonoBehaviour
6 {
7    [SerializeField] private GameObject[] candy = new GameObject[3]; // GameObject型の変数candyを定義
8    [SerializeField] private GameObject _exit; // GameObject型の変数_exitを定義
9    [SerializeField] private SEController _se; // SEControllerを参照させる変数:_seを定義
10   [SerializeField] private bool[] showItem = new bool[3]; // bool型の変数showItemを定義
11   
12   private void CompleteJudge()
13   {
14       showItem[0] = candy[0].activeSelf; // candy[0]の表示・非表示を判定し、showItem[0]にtrueかfalseを入れ る
15       showItem[1] = candy[1].activeSelf; // candy[1]の表示・非表示を判定し、showItem[1]にtrueかfalseを入れ る
16       showItem[2] = candy[2].activeSelf; // candy[2]の表示・非表示を判定し、showItem[2]にtrueかfalseを入れ る
17
18        if (showItem[0] && showItem[1] && showItem[2])
19        {
20            _exit.SetActive(true);
21            _se.OnClick02();
22        }
23    }
24
25 }

7行目で、GameObject変数:candyを3つ(candy[0], candy[1], candy[2])定義しています

  • [SerializeField] private GameObject candy0;
  • [SerializeField] private GameObject candy1;
  • [SerializeField] private GameObject candy2;

上記のように書いても結果は同じですが、配列(GameObject [] candy)を使うと、一行に纏めて記述できるので便利です!
また、変数の個数が増えても「= new GameObject [3]」の数字を増やすだけで対応できます。

8行目で、GameObject変数:_exitを定義しています。この変数を使って脱出口(Exit)を参照させます。

9行目で「スクリプト:SEController」を参照させる変数:_seを定義しています。この変数を使ってOnClick02メソッドを呼び出し、脱出口をクリックした時の効果音を鳴らします。

10行目で、bool型の変数:showItemを3つ(showItem[0], showItem[1], showItem[2])定義しています

  • [SerializeField] private bool showItem0;
  • [SerializeField] private bool showItem1;
  • [SerializeField] private bool showItem2;

上記のように書いても結果は同じです。
また、bool型は、true(真)または false(偽)を返すデータ型です。変数:showItemには、candyの表示・非表示判定(アクティブ判定)の結果(表示ならtrue、非表示ならfalse)が入ります。

メソッド名はクラス名と同じにできないため「CompleteJudge」としました。

14行目の「showItem[0] = candy[0].activeSelf;」で、Candy4のアクティブ判定の結果が「変数:showItem0」に入ります。同様に、15行目ではCandy5の判定結果がshowItem1に、16行目ではCandy6の判定結果がshowItem2に入ります。

18行目のif文の引数「showItem[0] && showItem[1] && showItem[2]」は「showItem0, showItem1, showItem2 すべてが true」であること(=Inventoryのお菓子が3つすべて表示状態)を示しています

20行目から21行目は、18行目の条件を満たした時の処理です。
脱出口(Exit)を表示し、SEControllerのOnClick02メソッドを使って効果音を鳴らします

スクリプトをアタッチする

次に、スクリプト:GameCompleteをアタッチするゲームオブジェクトを作ります。

Hierarchyウインドウで「Create Empty」を追加し、名前を入力して確定します。ここでは「CrearJudge」としました。

空のゲームオブジェクト:CrearJudgeを追加

HierarchyウインドウでCrearJudgeを選択し、Inspectorウィンドウの「Add Component」から「スクリプト:GameComplete」をアタッチします。Inspectorウインドウの変数に参照先をセットしましょう。

CrearJudgeのInspectorウインドウ
スクリプト:CrearJudgeの変数設定
  • 変数:Candy
    クリア判定に用いる。InventoryのCandy4・Candy5・Candy6を参照
  • 変数:Exit
    クリア時に脱出口を表示させるため、Exitを参照
  • 変数:SE
    脱出口を表示した時に効果音を鳴らすため、スクリプト:SEControllerを参照
  • 変数:Show Item
    クリア判定に用いる。Candy4, 5, 6のアクティブ判定結果(true / false)が入る

スクリプト:ItemControllerを修正する

アイテムを1つ入手するごとにクリア判定を行い、条件が揃ったら(=アイテムを3つ入手したら)脱出口を表示させたいので、第8回で作成した「スクリプト:ItemController」に「CompleteJudgeメソッド」を書き足します

1 using System.Collections;
2 using System.Collections.Generic;
3 using UnityEngine;
4
5 public class ItemController : MonoBehaviour
6 {
7    [SerializeField] private GameObject _getitem; // GameObject型の変数_getitemを定義
8    [SerializeField] private GameComplete _gc; // GameCompleteを参照させる変数:_gcを定義
9
10    public void ItemShow()
11    {
12        _getitem.SetActive(true);
13    }
14
15    public void ItemHide()
16    {
17        this.gameObject.SetActive(false);
18        ItemShow();
19        _gc.CompleteJudge();
20    }
21 }

グリーンの文字8行目で「スクリプト:GameComplete」を参照させる変数:_gcを定義しています。この変数を使ってCompleteJudgeメソッドを呼び出し、クリア判定や脱出口の表示を行います。

オレンジの文字19行目で変数:_gcを使ってCompleteJudgeメソッドを呼び出しています。こうすることで、Inventoryにアイテムが1つ入る度にクリア判定が行われます。

ゲームオブジェクト:CrearJudgeを参照させる

ItemControllerに「変数:_gc」を追加で定義したので、Candy1・Candy2・Candy3のInspectorウインドウに「変数:Gc」が増えています。

Inspectorウインドウに変数:_gc欄が追加される

「変数:Gc」には「スクリプト:GameComplete」がアタッチされている「空のゲームオブジェクト:CrearJudge」を参照させます

再生モードでプロジェクトを実行する

エディター画面のツールバーにある「▶(再生ボタン)」をクリックすると、Gameビューに切り替わり、再生モードでプロジェクトが実行されます。

お菓子を3つ入手したタイミングで効果音が鳴り、Room1に脱出口が表示されればOKです!
GameビューからSceneビューに戻るには、もう一度、再生ボタンをクリックします。

ゆくすぃ

以上で、今回の2D脱出ゲームは完成です!
ここまで辿り着いてくれた皆さん、本当にお疲れ様でした!

まとめ

今回の記事では、クリア判定について解説しました。
以上でゲーム自体は完成しましたが、最終目標は「ブラウザゲームとしてリリースすること」です

次回は、【最終回】超入門!Unityで2D脱出ゲームを作ろう!「リリース編」です。

以上、最後まで読んでいただき有難うございました!

よかったらシェアしてね!
  • URLをコピーしました!
目次