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