Categories: making

ゲーム「ワガハイ式ぷよぷよ」 制作手順3-1

各ぷよに付けるスクリプトを記述しよう1

このページでは、各ぷよオブジェクトに付けるスクリプトを記述していきます。

スクリプトを書く前に…(作戦の復習)

制作手順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 他のぷよの上に着地するまで落下

次に、コンビ解散直、各ぷよごとに地面 or 他のぷよの上に着地するまで落下の挙動をスクリプト化します。

実はこの話、制作手順2-32-4とかで書いてきました、コンビ解散ぷよセットオブジェクト(親)消滅の条件判断文が、こちらでも同様に使い回せるんです!!

というのも、制作手順2-3でも書きましたが、コンビ解散の条件とは、どちらかのぷよが地面 or 他のぷよの上に着地した瞬間でして、特に基本形(0°回転の状態)の場合、ぷよセットオブジェクト(親)が地面 or 他のぷよの上に着地した瞬間でした。

↑を読んで気付かれた方は勘が良い方だと思いますが、今から実装する話って、↑の話の「ぷよセットオブジェクト(親)」を「ぷよオブジェクト」に置き換えるだけ!ですよね!!という訳で、制作手順2-32-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-32-4のスクリプト丸パクリ…ですよね!もし落下未完了ならy方向に-1.0f移動して更に落下していき、落下が完了したら変数num=0→1に変わって、それ以降は何もしないスクリプトとなります。

今回はここまでになります。今回で、箇条書きの1つ目、2つ目までは書けましたので、次回は箇条書き4つ目「ぷよ消滅により浮かんでるぷよがあれば、再び地面 or 他のぷよの上に着地するまで落下」について書いていきます!

r_yoshi

Recent Posts

ゲーム「ワガハイ式テトリス」 制作手順4-2

監督スクリプトを記述しよう(ブ…

5年 ago

動的配列(List型)のご紹介と活用法

こちらのページでは、Unity…

5年 ago

ゲーム「ワガハイ式テトリス」 制作手順4-1

監督スクリプトを記述しよう(ブ…

5年 ago

ゲーム「ワガハイ式ビリヤード」 制作手順2-5

監督スクリプトを記述しよう こ…

5年 ago

ゲーム「ワガハイ式テトリス」 制作手順2-1

テトリミノに付けるスクリプトを…

5年 ago

ゲーム「ワガハイ式ぷよぷよ」 制作手順3-2

各ぷよに付けるスクリプトを記述…

5年 ago