このページでは、前回に引き続き、ゲームの監督スクリプトを記述していきます。監督スクリプトの主なお仕事は以下のような感じでしたね。
・ゲーム開始直後、数球オブジェクトを初期配置に並べる
・自分のターンにて、パワーや方向などを調節し、手球を発射
・CPUが(とあるルールにのっとり)パワーや方向などを調節し、手球を発射
・発射後、手球や数球の状況によって、次の番が自分かCPUかを決定する
前回までで自ターン、CPUターン時の動きについて、スクリプト化完了しました。今回は最後に、発射後の待ち時間や次の番が自分かCPUかを決定するスクリプトを書いていきましょう!これも結構話盛り沢山なので、2ページに分けて説明していきます!
今回はUpdateメソッド中の、waittime=1、つまり待ち時間中の処理を書いていきます。この変数にピンと来ていない方は、制作手順2-2のページ前半で、Updateメソッドの全容を紹介していますので、まずはそちらをご確認下さい。m(_ _)m
待ち時間中は、とりあえず台上全ての球が停止するのを見守ります。そして、全ての球が止まったら、待ち時間中に起こったイベントによって、次の番が自分かCPUかを決定します。
スクリプトを書く前に、まずはどのイベントが起こると次の番はどうなるかについて一旦整理しておきます。ビリヤードご存知の方もそうでない方も、ここはややこしい所ですので落ち着いて整理していきましょう。
①手球がポケットに入った場合→ファールで次は相手の番(もし9番球がポケットに入った場合、9番球は復活する)
②手球がどの数球とも当たっていない場合→ファールで次は相手の番
③手球が最初に最小番号の数球に当たっていない場合→ファールで次は相手の番(もし9番球がポケットに入った場合、9番球は復活する)
④①~③に該当せず、かつ数球が台上から一つも減ってない場合→ファールでは無いが、次は相手の番
⑤①~③に該当せず、数球が一つ以上台上から減った場合→次は再度自分の番(もし9番球がポケットに入った場合、入れた人がその時点で勝利)
なお、「ファールで次は相手の番」となった場合、相手は手球を自由な位置に配置出来ます(要するにcanmove=0)。
以上のような場合分けをする必要があります。これをスクリプトにざっくり書くと、とりあえず以下のようになります。場合分けが多いので、どうしても概要だけでも長いスクリプトになってしまいますが…。
//ボール動いてて待ち中… if (this.waittime == 1){ //待ち時間中はフィールド上の全球の速度、角速度監視 //両方0になるまで待ち(1秒ごとに判定) this.delta += Time.deltaTime; if (this.delta > 1.0f){ this.delta = 0f; //手球残っている場合 if (手球残っている場合){ //【要追加】①手球が止まっているかの確認 //【要追加】①台上に残ってる数球が止まっているか全確認 //完全に止まった後の処理 if (手球が止まっていたら){ if (台上の数球が全て止まっていたら){ this.waittime = 0; this.readyswitch = 0; if (どの数球にも当たっていない場合){ //ファールで相手のターン //【要追加】②次の番は交代 this.canmove = 0; //次の人は手球自由に移動可 } else if (最初に最小番号の数球に当たっていない場合){ //ファールで相手のターン //【要追加】②次の番は交代 this.canmove = 0; //次の人は手球自由に移動可 if (9番球が消滅した場合){ //【要追加】③9番球復活 } } else if (数球が一つも減ってない場合){ //ファールでは無いが相手のターン //【要追加】②次の番は交代 this.canmove = 1; //次の人は手球の移動不可 } else { //数球が一つ以上減った場合は再度自分のターン this.canmove = 1; //次は手球の移動不可 if (9番球が消滅した場合){ //この場合、ゲーム終了 if (this.myturn == 0){ this.myturn = 2; //ゲーム終了判定(勝利) } else { this.myturn = 2; //ゲーム終了判定(敗北) } } } } } } else { //手球消滅時はファールで相手のターンへ(数球の停止を待つ) //【要追加】①台上に残ってる数球が止まっているか全確認 //完全に止まった後の処理 if (台上の数球が全て止まっていたら){ this.waittime = 0; this.readyswitch = 0; //次は相手のターン //【要追加】②次の番は交代 this.canmove = 0; //次の人は手球自由に移動可 //手球再生成 this.player_ball = Instantiate(playerballprefab) as GameObject; if (9番球が消滅した場合){ //【要追加】③9番球復活 } } } } }
既に長いスクリプトになっていますが…、まずは↑のような大まかな流れを理解して下さい。次に細かなスクリプトを挿入していきます。コメント行の最初に【要追加】と書いてある行には、その後書いてあるような内容のスクリプトを追加する必要があります。
また、↑のスクリプト中には、if文の条件部分が日本語で書いてある所が多くあり、これもスクリプト化する必要がありますね。
ただし、これらのスクリプトについては次回説明します。その前に、以下では手球・数球スクリプトと相互作用するメソッドについて先に解説しておきます。突然何で!?と思われるかもしれませんが、これらのメソッドを理解しておくことで、次回の説明が非常に楽になるからです!急がば回れ、という感じになりますが、お付き合い願います。m(_ _)m
手球・数球スクリプトの解説は制作手順3のページで行います。実は、上で概要を書きました、監督スクリプト中の待ち時間、次の番判定の処理部分については、手球・数球スクリプトの挙動と大きく関わりがあります。
以下では、手球・数球スクリプトから呼び出される監督スクリプト内のメソッドを解説しておきます。いずれのメソッドも仕組みは凄く単純ですが、凄く重要な役割を果たしています。手球・数球スクリプト側から解説した制作手順3のページと併せて以下を読んで頂くと、理解が早まると思います!
ちなみにこの後、2種類の動的配列が登場します。今回と次回、これらの動的配列が大活躍していきますが、動的配列???という方は一旦こちらのページに別途纏めましたので併せて参考にして下さい。m(_ _)m
手球が消滅した場合、手球スクリプトから呼び出されるメソッドです。中身としては、監督スクリプト側で手球消滅したことを記憶しておくだけになります。このメソッドのお陰で、上で概要を書いた次の番判定スクリプト中でのif(手球残っている場合)が簡単に書けます(詳細は次回説明します!)。
public void delplayerball(){ this.remain_playerball = false; }
手球と数球が当たった時に、当たった数球の番号を当たった順に監督スクリプト内にメモしておくメソッドになります。collidelist という動的配列(本配列は、手球発射前に中身がリセットされます…制作手順2-3前半参照)に番号をメモします。このメソッドのお陰で、次の番判定スクリプト中でのif (どの数球にも当たっていない場合)、else if (最初に最小番号の数球に当たっていない場合)が簡単に書けます(詳細は次回説明します!)。
public void addcollideballlist(int ballnum){ this.collidelist.Add(ballnum); }
制作手順2-2後半以降、幾度となく登場してきた動的配列remaininglistですが、やっと何をしている配列かがここで明らかになります!
動的配列remaininglistの利用価値は非常に高く、これまで制作手順2-2、2-3、2-4中でも何度も登場してきましたね。上に書いた次の番判定スクリプト中でも、例えばelse if (数球が一つも減ってない場合)が簡単に書けるようになります(詳細は次回説明します!)。
また、除外番号が9の場合は特殊な措置が必要なため、del9ballというbool型変数にそのことをメモしておきます。この変数を用いると、次の番判定スクリプト中でのif (9番球が消滅した場合)が簡単に書けます(詳細は次回説明します!)。
public void delballlist(int ballnum){ //this.remaininglist = {1, 2, 3, 4, 5, 6, 7, 8, 9} から消えたballの番号を除外 //Remove(i):要素iを取り除く this.remaininglist.Remove(ballnum); if (ballnum == 9){ this.del9ball = true; }
今回は、待ち時間、次の番判定の処理について、Updateメソッド中にスクリプトの概要を書いていきました。そして、手球・数球スクリプトから呼び出される監督スクリプト内のメソッドを3つ紹介しました。
これらをふまえて、次回はいよいよ、待ち時間、次の番判定の処理スクリプトの詳細部分について、一気にスクリプト化していきます!!