脱出ゲーム
引き続き。なんかしれっと項目の内容変わってね?
まぁいいんだけどさ。
何をするか
ちょっと整理する。
今作ってるのは「鍵を使って扉を開けるゲーム」。前回までで、クリックしたら扉が開く、というところが作れた。現在までに教えてもらった内容を利用して、目標までにあと何が必要だろうか。
そもそも「鍵を使って扉を開けるゲーム」として期待される動作とは何だろう。スタートから分解してみる。
- 画面に扉と鍵が表示されている
- この時点で扉をクリックしても開かない
- 鍵をクリックする(鍵を取得する)
- 鍵が消える(鍵を取得したことの演出)
- 扉をクリックする
- 扉が開く
- 脱出成功の表示が現れる
大体こんな感じかなぁ。前回までで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を設定する。
そしたら実行すると
できた~。次回で完成かな?
コメント