このページでは、各ぷよオブジェクトに付けるスクリプトを記述していきます。
制作手順1の後半でも書きましたが、ぷよオブジェクトは、「コンビで活動時」と「コンビ解散後」では挙動が異なる!という話でした。何のこっちゃ?という方は制作手順1の後半を是非お読み下さい。m(_ _)m
簡単に復習しますと、「コンビで活動時」(組ぷよでの落下中)は、2つのぷよぷよ(子)はぷよセットオブジェクト(親)に属しています。この時は、各ぷよに付いてるスクリプトはお休みしており、挙動はぷよセットオブジェクト(親)に付いているスクリプトで制御されていました。そのスクリプトは制作手順2-1以降で書いてきましたね!
そして、どちらかのぷよが着地するとコンビ解散=ぷよセットオブジェクト(親)は消滅します。「コンビ解散後」は、各ぷよに付いているスクリプトが発動し、各ぷよの挙動を制御していきます。この制作手順3-1以降では、ぷよオブジェクトに付けるスクリプトについて、説明していきます。よろしくお願いします!
コンビ解散後のぷよはどのような挙動をするでしょうか。これも、100回ぐらいぷよぷよやった皆様なら何となくイメージ出来ますよね…。とりあえず書き下してみると、以下のような感じでしょうか。
・ぷよセットオブジェクト(親)が消滅するまでは、本スクリプトは休み
・コンビ解散直後、各ぷよごとに地面 or 他のぷよの上に着地するまで落下
・ぷよの落下が完了次第、同色ぷよが4個以上隣り合っていたら消滅
・ぷよ消滅により浮かんでるぷよがあれば、再び地面 or 他のぷよの上に着地するまで落下
基本的にはこんな所でしょう。箇条書き1つ目は挙動?とは少し違う気もしますが、スクリプトを書く上では重要な要素なので、ちゃんとリストに書いておきました。
また、箇条書き3つ目「ぷよの落下が完了次第、同色ぷよが4個以上隣り合っていたら消滅」に取消線を入れました。これについては、各ぷよに付けるスクリプトには書かずに、監督スクリプトに実装します。というのもこの挙動は、各ぷよごとの挙動と言うよりは、フィールド全体での挙動と解釈したためです(この辺の考え方は人によりけりと思います、あくまで私ワガハイの考え方です)。この挙動については、監督スクリプトの説明をしていく制作手順5-1以降で具体的にスクリプト化していきますので、詳しくはそちらを参照して下さい。
よって、箇条書き1、2、4つ目の挙動について、スクリプトに記述していきますね!
まずは、ぷよオブジェクトに付けるスクリプトとして基本となる、↑の機能を実装します。要するに「if(親がいない場合)」というif文を書けばよいのですが、ここから更に、「if(自分の親が自分自身の場合)」と言い換えればOKです。どういうこと!?ってなると思います(笑)が、スクリプト文上では同じ意味になります。かなり独特な解釈ですが、便利な書き方なので知っておきましょう。よって、Updateメソッド中には以下のように書いておきます。
//親がいない場合=自分の親(root)が自分自身の場合、と解釈 if(transform.root.gameObject == gameObject){ //コンビ解散後の挙動を記述 }
次に、コンビ解散直後、各ぷよごとに地面 or 他のぷよの上に着地するまで落下の挙動をスクリプト化します。
実はこの話、制作手順2-3、2-4とかで書いてきました、コンビ解散=ぷよセットオブジェクト(親)消滅の条件判断文が、こちらでも同様に使い回せるんです!!
というのも、制作手順2-3でも書きましたが、コンビ解散の条件とは、どちらかのぷよが地面 or 他のぷよの上に着地した瞬間でして、特に基本形(0°回転の状態)の場合、ぷよセットオブジェクト(親)が地面 or 他のぷよの上に着地した瞬間でした。
↑を読んで気付かれた方は勘が良い方だと思いますが、今から実装する話って、↑の話の「ぷよセットオブジェクト(親)」を「ぷよオブジェクト」に置き換えるだけ!ですよね!!という訳で、制作手順2-3、2-4のスクリプトをほぼ丸パクリ出来ます!!(笑)
GameObject[] puyos ; GameObject Director ; int num = 0 ; //num=0で落下し、終了時にfallcheckへ、num=1なら休止 float[] puyox = new float[100]; float[] puyoy = new float[100]; //以下をStartメソッド中に int i = 0; this.Director = GameObject.Find("Director"); this.puyos = GameObject.FindGameObjectsWithTag("puyo"); 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++; } //以下をUpdateメソッド中に int i = 0; //丸め誤差解消(自分の今の位置) nowx = Mathf.RoundToInt(transform.position.x * 10.0f)/10.0f; nowy = Mathf.RoundToInt(transform.position.y * 10.0f)/10.0f; if(this.num==1) return; //落下完了済なので以下の処理不要 if(transform.root.gameObject == gameObject){ //コンビ解散後の挙動を記述 if(nowy == -5.5f) { this.num = 1; //落下完了をお知らせ return; } i = 0; foreach (GameObject puyo in this.puyos) { if(nowx == this.puyox[i] && nowy == this.puyoy[i] + 1.0f) { this.num = 1; //落下完了をお知らせ return; } i++; } //落下完了していないので引き続き落下 transform.Translate(0,-1.0f,0, Space.World); }
最初に書きました、「if(親がいない場合)」の中身で、ぷよオブジェクト(自分自身)の落下完了判定を行っており、ここの書き方は制作手順2-3、2-4のスクリプト丸パクリ…ですよね!もし落下未完了ならy方向に-1.0f移動して更に落下していき、落下が完了したら変数num=0→1に変わって、それ以降は何もしないスクリプトとなります。
今回はここまでになります。今回で、箇条書きの1つ目、2つ目までは書けましたので、次回は箇条書き4つ目「ぷよ消滅により浮かんでるぷよがあれば、再び地面 or 他のぷよの上に着地するまで落下」について書いていきます!