脱出ゲーム
引き続き。なんかしれっと項目の内容変わってね?
まぁいいんだけどさ。
何をするか
ちょっと整理する。
今作ってるのは「鍵を使って扉を開けるゲーム」。前回までで、クリックしたら扉が開く、というところが作れた。現在までに教えてもらった内容を利用して、目標までにあと何が必要だろうか。
そもそも「鍵を使って扉を開けるゲーム」として期待される動作とは何だろう。スタートから分解してみる。
- 画面に扉と鍵が表示されている
- この時点で扉をクリックしても開かない
- 鍵をクリックする(鍵を取得する)
- 鍵が消える(鍵を取得したことの演出)
- 扉をクリックする
- 扉が開く
- 脱出成功の表示が現れる
大体こんな感じかなぁ。前回までで5と6の部分を作れた。
今回はここに「鍵を取得したかどうか」という2と3の要素を加えることになる。ではここで、その要素を実現するための仕組みを考えなければならない。ここでいう仕組みというのはフローチャート的なもので、Unity上でどう実現するか、という視点とはまた別だ。いったん、5と6ではどういう仕組みにしたか振り返ると
- 画面に扉を表示する
- 扉の所には透明なボタンを設置する
- 扉=透明なボタンをクリックすると、扉の画像を閉じているものから開いてるものへ差し替える
という仕組みで、クリックしたら扉が開くという動作を実現できた。前回はこれをUnity上に落とし込んだわけだ。ここに2と3の要素を加えるにはどうしたらよいだろうか。
2と3の要素というのは「鍵を取得したかどうか」によって処理を分けることによって実現できる。「鍵を取得したかどうか」は、双六の時にやったフラグを利用することで判定できる。つまり、「もし鍵を取得していたら、扉をクリックした時に扉が開く」という動作の仕組みを考えることになる。じゃあ
- 画面に鍵を表示する
- 「鍵を取得したかどうか」を判定するためのフラグを用意する
- 鍵と同形に透明なボタンを設置する
- 鍵=透明なボタンをクリックしたら、2のフラグを立てる(オンにする・trueを入れる)
- 扉をクリックすると、フラグから「鍵を取得したかどうか」を判定し、取得していたら扉の画像を差し替える
という仕組みで実現できそうだ。ということで、これをUnity上に落とし込んでいく。
フラグが立っていない時は扉が開かないようにする
Doorを
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Door : MonoBehaviour
{
public Image image;
public Sprite sprite;
public bool flag = false;
public void Open()
{
if (flag == true)
{
image.sprite = sprite;
}
}
}
こう変えた。フラグ用変数をflagって命名しちゃいけないてどっかで見たけどそれは置いといて、このflagが鍵を持っているかどうかを表すことになる。
鍵の画像とボタンを用意
Canvas上にImageで鍵の画像を読み込み、透明なボタンを作成する。
鍵をクリックしたらフラグを立てる
新たにKeyスクリプトを作る。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Key : MonoBehaviour
{
public Door door;
public void PickUp()
{
door.flag = true;
}
}
ImageやSpriteやTextと同じく、自分で作ったDoorでも変数を宣言できるんだなぁ。考えてみりゃそうなんだけど、教わらないと難しいよなこれは。PickUp関数内ではDoorが持ってるflagにtrueを代入している。このフラグは鍵を持っているかのフラグなので、これで鍵を持っていることになる。スクリプトを保存したら鍵用のButtonのAddComponentにD&Dし、InspectorのKey(script)のDoorには扉のImage、onClickには自分自身であるButton、FunctionにPickUpを設定する。
そしたら実行すると
できた~。次回で完成かな?


