このページでは、ゲームの監督スクリプトを記述していきます。制作手順5-1でも取り上げましたが、監督スクリプトのお仕事は主に以下のようになります。
・ぷよの落下が完了次第、同色ぷよが4個以上隣り合っているぷよを消滅させる
・ぷよを消した際、左上の「○○個消した」の所の数字を更新
・組ぷよ出現位置にぷよが残っていたらゲームオーバー画面に移行
・ぷよ消滅後、残ったぷよに再落下の指示
この内、前回まででぷよの落下が完了次第、同色ぷよが4個以上隣り合っているぷよを消滅させるスクリプトがやっとこさ完成しました!本ページでは、残り3つのお仕事をスクリプトに一気に書き上げていきます!!
まず、監督スクリプトの2つ目の仕事である、ぷよを消した際、左上の「○○個消した」の所の数字を更新するスクリプトを書きましょう。本家ぷよぷよでは、消えたぷよの数(消し方)に応じて相手におじゃまぷよを送り込むアルゴリズムが組み込まれていますが、今回のワガハイ式ぷよぷよは一人用なこともあり、簡易的に合計削除ぷよ数を左上に示しています。
こういうゲームの進行度を現す物が無いと、ゲームのモチベーションって上がらず、「今何個ぐらい消したんやろか…、分からんなぁ、もうええわ」ってなりそうですよね。なので、簡単なものになりますが、今回は合計削除ぷよ数を左上に表示しておきます。
int deleteall = 0; //deleteall:これまでに消してきた総削除ぷよ数 int deletenum = 0; //deletenum:今回消したぷよ数 this.deletenum = 0; //ぷよ落下終了時に毎回0にリセット int i = 0; foreach (GameObject puyo in this.puyos) { if(this.samecolornums[i]>=4) this.deletenum ++ ; i ++ ; } //textに総削除puyo数表示 this.deleteall += this.deletenum; this.deletenumtext.GetComponent<Text>().text = this.deleteall.ToString("D3") + "個消した";
一点だけ注意があります。このスクリプトはぷよオブジェクト削除前に書いて下さい。でないとforeach文にて全ぷよオブジェクトを順番に呼び出す際、既に消滅済のぷよまでムリヤリ呼び出すことになり、NullReferenceExceptionのエラーが発生してしまうためです!!
次に、監督スクリプトの3つ目の仕事である、組ぷよ出現位置にぷよが残っていたらゲームオーバー画面に移行するスクリプトを書いていきましょう。
これは比較的書きやすいと思います。組ぷよ出現位置=(-0.5f,6.5f)にぷよが残っているとシーン移行(=SceneManager.LoadSceneメソッド…この本の6-10章参照)です。という訳でこんな具合でしょうか。
for(i = 0; i < this.puyos.Length; i++) { if(this.puyox[i] == -0.5f && this.puyoy[i] == 6.5f ) { SceneManager.LoadScene("gameover"); } }
最後に、監督スクリプトの4つ目の仕事である、ぷよ消滅後、残ったぷよに再落下の指示するスクリプトを書いていきましょう。ここまでのスクリプトですと、4個以上隣り合ったぷよが消えたまま、残りのぷよは浮いたままになっています。それではゲームになりませんので、残ったぷよには「落ちれる所まで落ちなさい!」という号令を出します。
ただそれには、各ぷよに実装されているスクリプトを活用します。制作手順3-2の方でもお話しましたように各ぷよに実装されているスクリプト中にはnumというint変数があり、簡単に言うとnum=0の場合は落下できる所まで落下していく、落下完了したらnum=1になって動かないっていう挙動でした。
では再落下の挙動はどうすれば良いでしょう?答えは非常にシンプルで、残っている各ぷよのnumを再び0に戻してやればよいのです!そしたらすぐ下が空いてるぷよは再び落下出来る所まで落ちてnum=1になりますし、落下出来ないぷよに関しては即座にnum=1に戻ります(落下判定は各ぷよスクリプト中のUpdateメソッド中で行っています)。
また、「残っているぷよにのみ指示」というのはi番ぷよのsamecolornums[i]>=4ならi番ぷよは削除されていますので、これを逆手にとってi番ぷよのsamecolornums[i]<4ならi番ぷよに再落下の指示を出します。なお、もし全ぷよに指示を出してしまうと、既に削除されたぷよオブジェクトにも指示を出してしまうことになり、NullReferenceException のエラーが発生します。
ってことで、監督スクリプト側に書くのはこんな具合でしょうか。こんだけで良いのか…(歓喜)。各ぷよ側のスクリプト(numresetメソッド)の書き方については制作手順3-2の方を参照にして下さい。
for(i = 0 ; i < this.puyos.Length ; i++) { if(this.samecolornums[i]<4) { this.puyos[i].GetComponent<puyoController>().numreset(); } }
これで、制作手順5-1にて定義しました、監督スクリプトの主なお仕事4つについては無事スクリプトに書き下すことが出来ました。実際のワガハイ式ぷよぷよではもっと他にも沢山の細かなお仕事をこなしており、制作手順5-1~5-5までの話ではまだまだ不十分ですが、監督スクリプトの重要部分はこれで以上になります。さらに詳しい話を知りたい方は私ワガハイの方までお問い合わせ下さい。ありがとうございました!!