top of page

Unityで「シューティングゲーム」をつくろう!Vol.06

 Unityで作る「シューティングゲーム」前回はちょっと重たい課題だったので、隕石のプログラムが途中で終わってしまいました。今回は、隕石を打ち落とすプログラムを追加。さらに、隕石をプレハブ化してたくさん出現させる仕組みを作ってみます。


 では早速作っていきましょう!

 

Step:1 隕石の強度を追加


 隕石をミサイル1発で打ち落とせたら、ちょっとつまらないですよね?まずは隕石に強度を持たせ、ミサイル1発ごとに強度を減算、強度が0になったタイミングで隕石を削除。というプログラムに改造していきます。前回のプログラミングで隕石にfloat型の 変数[scale] という隕石の大きさを表す変数を宣言し、3~8の値を乱数で代入しました。この変数を強度として活用しましょう。


 隕石のプログラム「Asteroid.cs」を立ち上げ、以下のプログラムを追記します。

 

void OnTriggerEnter2D(Collider2D col) //衝突判定

{

if (col.gameObject.tag != "Enemy") //衝突の対象が "Enemy" でなければ

{

scale--; //強度を1ずつ減算

//爆発のプレハブを生成

Instantiate(explosion, transform.position, Quaternion.identity);

if (scale <= 0) //もし強度が0以下になったら

{

Destroy(gameObject); //消滅させる

}

}

}

 

隕石がミサイルに当たった時のプログラミングです。


if (col.gameObject.tag != "Enemy") 

この「!=」これは否定を表す意味で、「衝突した対象のタグが、"Enemy"でなければ」という意味です。現段階で、"Enemy"タグを持ったゲームオブジェクトはありませんが、この先「敵」を作っていく段階で、敵が隕石に当たって自滅するのを防ぐために、このようなプログラムを追記しておきます。


scale--;

これは、scale = scale -1 という意味で、当たるたびに変数「scale」を1ずつ減らすという意味になります。[scale--] という記述方法、これは「デクリメント」と呼ばれます。


Instantiate(explosion, transform.position, Quaternion.identity);

衝突するたびに、前回宣言した爆発プレハブを生成、第二引数で隕石の場所、第三引数で回転しないという意味の「 Quaternion.identity」を指定しています。


さらに「if文」を使って強度が0以下になったタイミングで、ゲームオブジェクトを削除しています。


これで隕石のプログラミングは一旦完成です。このように作ったプログラムにどんどん機能や性能を追加できるのが、プログラミングの醍醐味ですよね?

最後は、作成した隕石のゲームオブジェクト「Asteroid」を Hierarchy から Project の [03_Prefab]フォルダにドラッグ&ドロップして、プレハブ化しておきます。

 

Step:2 隕石の生成プログラム

 せっかく隕石を作ってみたものの、現状スタートと同時に1体出現するだけでゲームとして成立しません。続いては定期的に隕石が生成される仕組みを作ってみます。この仕組みですが、「GameManager」という新たな登場人物に任せたいと思います。


②Hierarchy で新たなゲームオブジェクトを作成します。Create Empty で生成したゲームオブジェクトに「GameManager」という名前を付与します。

③さらに[02_Script]フォルダ に「GameManager」というスクリプトファイルを作っておきます。「GameManager」という名前にすると、アイコンが歯車に変るようですね。

作成したスクリプトファイルに以下のコードを記述します。

 

[SerializeField] GameObject asteroidPrefab; //隕石のプレファブ

int D; //出現判定係数


//隕石生成

void CriateAsteroid()

{

GameObject asteroid = Instantiate(asteroidPrefab); //隕石を生成し変数に代入

 //隕石の出現場所を乱数で指定

asteroid.transform.position = new Vector3(Random.Range(-20, 20), 12f, 0);

}


void Update()

{

D = Random.Range(0, 2000); //0から2000までの乱数をDに代入

if (D == 0) //もしDが0なら

{

CriateAsteroid(); //隕石を生成

}

}

 

 まずは隕石のプレハブを使うためのGameobject型の変数[asteroidPrefab]を宣言します。[SerializeField] を指定することで、Inspector から指定することができます。

 整数型 変数[D] は隕石が出現する条件を乱数で取得するための変数です。出現するタイミングで変数なしで乱数で条件を指定してもいいのですが、この後隕石だけでなく、他の障害物も作っていきますので、流用できるように変数にしました。


続いて 関数[ CriateAsteroid() ] を宣言しています。これは隕石を生成するだけの関数ですが、生成した後に、出現場所も指定したいと思います。

GameObject asteroid = Instantiate(asteroidPrefab);

まずこのコードでGameobject型の変数[asteroid ]にプレハブを代入しています。

asteroid.transform.position = new Vector3(Random.Range(-20, 20), 12f, 0);

その直後に乱数を使って、出現場所を指定しています。


Update()関数では

D = Random.Range(0, 2000);

でまずは 0から1999までの乱数を取得し、変数[D] に代入。

if (D == 0) { CriateAsteroid(); }

取得した乱数が0なら、つまり1/2000 で隕石を生成します。この分母になる数値、つまり乱数の範囲は各自調整しましょう。


④最後はGameobject の Inspector から 変数 AsteroidPrefab にAsteroidのプレファブをセットしておきます。

これで定期的に隕石が出現しますよね?




今回はここまでです。次回は隕石と同じように、「宇宙ゴミ」(debris) のプレハブと動きを作成し、GameManagr から出現させたいと思います。


教室では実際に通って頂いての授業の他、Unityのオンライン授業やオンラインサポートも行っております。

お困りごとのある方、ご興味がある方は、ぜひお問い合わせください。


お問い合わせは こちら から。

体験授業のお申込みは こちら から。



過去の「Unityで作るシューティングゲーム」はこちらから。

Comentarios


bottom of page