
ごきげんよう、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」としました。


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


- 変数: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」が増えています。


「変数:Gc」には「スクリプト:GameComplete」がアタッチされている「空のゲームオブジェクト:CrearJudge」を参照させます。
再生モードでプロジェクトを実行する
エディター画面のツールバーにある「▶(再生ボタン)」をクリックすると、Gameビューに切り替わり、再生モードでプロジェクトが実行されます。
お菓子を3つ入手したタイミングで効果音が鳴り、Room1に脱出口が表示されればOKです!
GameビューからSceneビューに戻るには、もう一度、再生ボタンをクリックします。



以上で、今回の2D脱出ゲームは完成です!
ここまで辿り着いてくれた皆さん、本当にお疲れ様でした!
まとめ
今回の記事では、クリア判定について解説しました。
以上でゲーム自体は完成しましたが、最終目標は「ブラウザゲームとしてリリースすること」です!
次回は、【最終回】超入門!Unityで2D脱出ゲームを作ろう!「リリース編」です。
以上、最後まで読んでいただき有難うございました!