組ぷよに付けるスクリプトを記述しよう3
このページでも、前回から引き続き、ぷよセットオブジェクト(親)に付けるスクリプトを記述していきます。今回は、組ぷよの基本的挙動その3として挙げました、どちらかのぷよが着地すると組ぷよはコンビ解散についてスクリプトに書いていきます。
スクリプトを書く前に、もう少し噛み砕いていこう
「どちらかのぷよが着地」を噛み砕く(=より丁寧に言い換える)と?
・どちらかのぷよが地面に着地した時
・どちらかのぷよが他のぷよの上に着地した時
このどちらかになります。今回、これらの条件はそれぞれの別のスクリプト文で書いていきます。
「組ぷよはコンビ解散」を噛み砕くと?
その前にもう一度制作手順1で書いた作戦を復習しましょう。細かくスクリプトを書いている時こそ、全体像(=作戦)を忘れないようにすることが重要です!!
制作手順2-1からスクリプトを書いてきているのは、ぷよセット空オブジェクト(親)に付けるスクリプトでしたね。で、どちらかのぷよが着地するとぷよセットオブジェクト(親)は消滅し、コンビは解散!という話でしたね。
よって、「組ぷよはコンビ解散」を言い換えると、ぷよセットオブジェクト(親)が消滅という意味になります。
まとめると、今回書くスクリプトの概要は?
言い換え前:どちらかのぷよが着地すると組ぷよはコンビ解散
→言い換え後:どちらかのぷよが地面 or 他のぷよの上に着地した瞬間に、ぷよセットオブジェクト(親)が消滅する
スクリプトを書く上で、こういった言い換え・噛み砕きは非常に大切です。スクリプトを書いている最中に考えても良いですが、出来れば書く前に作戦を固めておきたいですね。
なお、ぷよセットオブジェクト(親)消滅後の各ぷよの挙動については、また別ページ(制作手順3-1以降)にて書いていきます。ここでは、あくまでぷよセットオブジェクト(親)の消滅まで、のスクリプトを書いていきます。
基本的挙動3「組ぷよの落下終了」をスクリプトで記述しよう
では、いよいよスクリプトを書いていくのですが、今回はとりあえず、前回スクリプトに実装した左右回転を使わず、基本的な形(0°回転の状態)のまま落下していく状況のみを考えます。コレ、結構重要なことになります。「なんで~?」という声もあると思いますが、一旦受け入れて下さい、お願いします。m(_ _)mm(_ _)m
地面に着地した時、ぷよセットオブジェクト(親)が消滅
まずは比較的簡単に書ける、「地面に」着地した時、ぷよセットオブジェクト(親)が消滅、についてスクリプトに書いていきます。
回転していない時は親オブジェクトは下のぷよと同じ位置に居ます。また右図より、下の地面に着地する時、下ぷよ(親オブジェクト)の中心Y座標=-5.5fになります。
よって、親オブジェクトの中心Y座標=-5.5fになれば、親オブジェクトが消滅と、とスクリプトに書けば良さそうですね!ここまで分かればあとはいけそうです!前回に引き続き、Updateメソッド中に書いていきます。
1 2 3 4 |
if(transform.position.y == -5.5f) { gameObject.transform.DetachChildren(); Destroy(gameObject); } |
2行目で親子関係を解除して、3行目でもう不要となったぷよセットオブジェクト(親)を削除します。
丸め誤差対策を実装しよう
ただこの文、実はちょっと微妙で、思い通りにいかない危険性があります。それは、コンピューター上で一般的に計算する際に現れる、丸め誤差という悪者が現れる可能性があるからです。特に小数点型(float)とかで計算してる際、計算結果がピッタリ思い通りにいかず、めっちゃ小さいズレ(正しい値より0.000001f大きいとか小さいとか)が発生する可能性があるんです(これはUnity関係なくプログラミングやってると必ず現れる現象です)。
これが原因と分からず、合うはずの計算が合わなくて苦しんでると、「もうPC計算なんて何も信じられへん…プログラミング嫌…」ってなります。お気持ちめっちゃ分かります。でもプログラミングやるからには、この丸め誤差と上手に付き合っていく必要があります。
そこで今回は、こんな風に書き換えます。丸め誤差を取り除く方法は幾つかあると思いますが、今回はこんな方法を取ります。
1 2 3 4 5 6 7 8 |
//丸め誤差解消 float nowx = Mathf.RoundToInt(transform.position.x * 10.0f)/10.0f; float nowy = Mathf.RoundToInt(transform.position.y * 10.0f)/10.0f; if(nowy == -5.5f) { gameObject.transform.DetachChildren(); Destroy(gameObject); } |
Mathf.RoundToIntは「小数第1位を四捨五入して整数化する」という関数です。要するに、四捨五入を利用して小さい誤差を消してしまおう、という作戦になります。
今回ぷよオブジェクトの中心位置座標は「○.5f」という小数第1位までの値になりますので、小数第2位を四捨五入したいのですが、残念ながらUnityのスクリプト文にはドンピシャそういう関数はありません。そこで上の2、3行目のように書きます。要するに、
1.49999f 【元の数、誤差あり】→(×10)→ 14.9999f →(四捨五入で整数化)→ 15 →(÷10)→ 1.5f【本当に欲しい数】
これで欲しい数が得られます。さよなら、丸め誤差(⌒ー⌒)ノ~~~
この手法は今後も使っていきますので、しっかり理解しておいて下さい。
今回はここまでです。組ぷよ落下終了条件の話についてはまだまだ一部しか書けてませんので、次回に続きます!