Unityで作るシューティングゲームVol6

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]フォルダにドラッグ&ドロップして、プレハブ化しておきます。

Unityで作るシューティングゲームVol6

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

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

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

Unityで作るシューティングゲームVol6

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

Unityで作るシューティングゲームVol6

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

[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);
その直後に乱数を使って、出現場所を指定しています。

➓ D = Random.Range(0, 2000);
Update関数内のこの処理で、まずは 0から1999までの乱数を取得し、変数:[D] に代入。

⓫ if (D == 0) { CriateAsteroid(); }
取得した乱数が0なら、隕石生成関数発動、つまり1/2000 で隕石を生成します。
この分母になる数値、つまり乱数の範囲は各自調整しましょう。

これで隕石生成のプログラムはいったん完成です。

④最後は Gameobject の Inspector から 変数 AsteroidPrefab に Asteroidのプレハブをセットしておきます。
これで不定期で何度でも隕石が出現しますよね?

Unityで作るシューティングゲームVol6

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

教室では実際に通って頂いての授業の他、Unityのオンライン授業やオンラインサポートも行っております。お困りごとのある方、ご興味がある方は、ぜひお問い合わせください。
お問い合わせは こちら から。体験授業のお申込みは こちら から。

無料体験授業 いつでも受け付けています!

体験授業を受ける子供

スクラッチ、Unityでちょっとしたゲームを作ってみる

HTMLやCSSでWebサイト作成体験

初めてパソコンやタブレットに触れてみる

エクセルやワード、パワーポイントの学習をちょっと体験

まずは1時間程度の無料体験授業を受けて、教室の雰囲気や講師の人柄に触れて頂き、ご自身、お子様に合うのかどうかご確認ください!