落下中の組ぷよに付けるスクリプトを記述しよう4
このページでも前回に引き続き、落下中の組ぷよに付けるスクリプトを記述していきます。今回も、どちらかのぷよが着地すると組ぷよの動きが終了についてのスクリプトを引き続き書いていきます。
基本的挙動3「組ぷよの落下終了」をスクリプトで記述しよう(続き)
前回のページでは、この落下終了条件について、少し噛み砕いてみましたね。
言い換え前:どちらかのぷよが着地すると組ぷよの動きが終了
→言い換え後:どちらかのぷよが地面 or 他のぷよの上に着地した時、空オブジェクト(親)が消滅する
で、前回は左右回転を使わず、基本的な形(0°回転の状態)のまま落下していく状況に限定してスクリプトを書き始めました。今回も引き続き、この状況の話を考えていきます。地面に着地する話は前回やりましたので、今回は他のぷよの上に着地した時のことを考えていきましょう!
他のぷよの上に着地した時、空オブジェクト(親)が消滅
前回からの繰り返しになりますが、回転していない時は親オブジェクトは下のぷよと同じ位置に居ます。よって、他のぷよの上に着地する、とは親オブジェクトが他のぷよの上に着地する、ということです。ここまで分かればあとは書けそう…とは今回はなりません。まずは、書くためのちょっとした下準備をしていきます。
「オブジェクトのタグ付け」を利用して全ぷよオブジェクトの座標抽出
ここまであまり触れませんでしたが、オブジェクトの名前などを特に決めていませんでしたので、ここで少し触れておきます。
まずオブジェクト名ですが、これは自然とぷよの種類で区別すると思います。異なる色のぷよには異なるmaterial付けないといけませんからね。私ワガハイの場合、赤ぷよ=「redpuyo」とかそんな感じです。まぁ名称はお好みで…。
ところで、ぷよのオブジェクトにタグって付けてありますか?これが実は使い勝手が目茶目茶良くて、異なる種類のオブジェクトでも同じタグを付けることで、同種のオブジェクトとして扱えるんです!
…どういうこと???となったらすいません。使ってみたらその威力が分かってもらえるかと…m(_ _)m
とりあえず今回は、ぷよのオブジェクト(赤ぷよも青ぷよも緑ぷよも…)は全て「puyo」という同じタグを付けます。そして、Startメソッドに以下の文を入れます。
1 2 3 4 |
//定義は配列で! GameObject[] puyos ; //以下はStartメソッド中 this.puyos = GameObject.FindGameObjectsWithTag("puyo"); |
GameObject.Findメソッドはこちらの本でもよく活用されていましたが、似たような感じで、GameObject.FindGameObjectsWithTagという、タグ名を検索するメソッドも存在します。要するに、上のスクリプト文で赤ぷよであろうが青ぷよであろうが、「puyo」とタグの付くオブジェクトを全てピックアップしてくれます。さらに、以下のようなスクリプトをStartメソッド中に追記します。
1 2 3 4 5 6 7 8 9 10 |
float[] puyox = new float[100]; float[] puyoy = new float[100]; //以下をStartメソッド中に i = 0; foreach (GameObject puyo in this.puyos) { //丸め誤差解消 this.puyox[i] = Mathf.RoundToInt(puyo.transform.position.x * 10.0f)/10.0f; this.puyoy[i] = Mathf.RoundToInt(puyo.transform.position.y * 10.0f)/10.0f; i++; } |
foreach文はこんな書き方でfor文と同じように繰り返し処理のスクリプト文が書けます(正直これなら別にforで書いても全然良いけど…(^^;))。また、前回の後半で説明しました丸め誤差で悩まないような工夫はここでも使っていきます。
これで現在地面に落ちている全ぷよのx座標とy座標が抽出出来ます。色々言いましたが、やりたかったのはコレです。そのために今回はタグを活用してみました。タグ付けの便利さがちょっとでも分かって頂けると幸いです…!
「他のぷよの上に着地した時」のスクリプトを記述
ここまで準備で、やっと本題のスクリプトが書ける…(^^;)ここまで来れば、どう書こうとしているかおおよそ察しがつくかもしれません。簡単に言いますと、現在地面に落ちている全ぷよの一つ上を確認し、親オブジェクトが居ないか確認する、居たら「着地」と認識するという総当たり作戦を取ります。スクリプトで書くとこんな具合でしょうか。
1 2 3 4 5 6 7 8 9 10 |
i = 0; foreach (GameObject puyo in this.puyos) { //落下終了条件 if(nowx == this.puyox[i] && nowy == this.puyoy[i] + 1.0f) { gameObject.transform.DetachChildren(); Destroy(gameObject); return; } i++; } |
「地面にあるぷよの一つ上を確認」というのは自分の位置座標に対し、x座標が同じで、y座標が+1の箇所を確認、という意味ですので、スクリプトで書くとこういう具合になります。
これで、他のぷよの上に着地した時のスクリプト文が書けました!
これで2記事に渡った落下終了条件に関するスクリプトは完了です…と言いたい所ですが、まだ大きな問題が残っています。このままですと、左右回転を使わず、基本的な形(0°回転の状態)のまま落下していく状況しか考えていないんでしたよね。よって、回転した形で落下する場合に全然対応出来ていません。回転しないままの場合と90°回転した場合では、もちろん着地条件もちょっと変わってきますよね。次回の記事ではここの所をフォロー出来るように、スクリプトをどんどん書いていきます。
今回はここまでです。組ぷよの落下終了条件に関しては、あとちょっと続きます!