Unityで作る「シューティングゲーム」前回はいん石を出現させて、打ち落とす仕組みを作ってみました。
今回は前回の復習となります。隕石ではなくデブリ(宇宙ゴミ)を出現させてみたいと思います。
では早速作っていきましょう!
Step:1 デブリの作成
①まずはデブリの素材を取り込みます。
隕石と同じように、まずは1つの画像を用意しておき、プログラミングから乱数を使って複数の画像を割り当てたいと思います。
画像を一つ選択し、Hierarchy にドラッグ&ドロップします。
②Inspectorに移動して、名前を「Debris」に変更します。Tag には「Enemy」を指定しておきましょう。
③SpriteRenderer コンポーネントの SortingLayer に前回作った「Enemy」を指定します。
④「BoxCollider2D」コンポーネントを追加します。
Edit Collider をクリックして、コライダーの大きさを合わせます。
さらに「IsTrigger」のチェックボックスに☑を入れます。 ここはいん石と違うところです。
⑤「Rigidbody2D」コンポーネントを追加します。
重力に当たる「GravityScale」に 0 を指定します。
これで素材の準備はOKです。
Step:1 デブリプログラムの作成
Debris.cs というスクリプトファイルを作成し、以下のコードを記述していきましょう。
[SerializeField] GameObject hit_effect; //当たった時のエフェクト
[SerializeField] GameObject explosion; //爆発
public Sprite[] sprites; //Sprite型の配列変数を宣言
private SpriteRenderer debRenderer; //SpriteRenderer型の変数を宣言
void Start()
{
debRenderer = GetComponent<SpriteRenderer>(); //❶SpriteRenderer を取得
debRenderer.sprite = sprites[Random.Range(0, 6)]; //❷乱数で画像を指定
GetComponent<Rigidbody2D>().velocity = new Vector2(Random.Range(-15, 16), Random.Range(-10, -2)); //❸デブリに速度を与える
Destroy(gameObject, 5f); //3秒後に削除
}
void OnTriggerEnter2D(Collider2D col) //❹何かのエリアに侵入したとき
{
if (col.gameObject.tag != "Enemy") //衝突の対象が "Enemy" でなければ
{
Instantiate(hit_effect, transform.position, Quaternion.identity); //❺ヒットエフェクトを生成
Destroy(gameObject); //デブリ自身は消滅
//❻爆発生成
GameObject effect = Instantiate(explosion, transform.position, transform.rotation);
Destroy(effect, 1.5f); //❼爆発エフェクトの削除
}
}
前回とほぼ同じですね?
❶ debRenderer = GetComponent<SpriteRenderer>();
❷ debRenderer.sprite = sprites[Random.Range(0, 6)];
ここで、デブリの画像を乱数で指定します。
デブリに「Debris.cs」をアタッチすると、[SerializeField] で指定した Sprite 配列を入力できる状態になります。
Sizeに6を指定、そうすることで配列の長さ(Element = 要素数)が6つに指定されます。
下の図のように6つの Element にそれぞれの画像を指定します。
❸ GetComponent<Rigidbody2D>().velocity = new Vector2(Random.Range(-15, 16), Random.Range(-10, -2));デブリの Rigidbody2Dコンポーネント を取得して、velocity という速度を管理するパラメーターのx、y それぞれにに、乱数を使った次の値を代入します。
x ⇒ -15~15 未満の乱数
y ⇒ -10~-2 未満の乱数
乱数を指定した場合、2つ目の引数は「未満」になるので、注意しましょう!
❹ void OnTriggerEnter2D(Collider2D col) { }
では IsTrigger 状態の RigidBody コンポーネントを持ったオブジェクトの領域に入った時に発動する関数です。
ここでは❺「hit_effect」と❻「explosion」を生成。
❼「explosion」は削除されるプログラムを持たないので、1.5秒後に削除される命令も指定しています。
これでデブリのプログラムができましたので、Hierarchy から「03_Prefab」フォルダにドラッグ&ドロップで、プレハブ化しておきます。
Hierarchy のデブリはもういらないので削除しておきます。
Step:2 デブリの生成プログラム
デブリが生成された後のプログラムができましたので、次はデブリを生成するプログラムですね。
作成済みの「GameMangager.cs」を開いて、以下のコードを追記します。
[SerializeField] GameObject Debri; //デブリのプレハブ
void CriateDebris() //❽デブリ生成の関数
{
GameObject debri = Instantiate(Debri); //デブリの生成
debri.transform.position = new Vector3(Random.Range(-20, 20), 20f, 0); //生成場所変更
}
void Update() //❾
{
D = Random.Range(0, 2000); //記述済み
if (D == 0) //記述済み
{
CriateAsteroid(); //記述済み
}
else if (D <= 5)
{
CriateDebris(); //デブリ生成関数
}
}
❽ void CriateDebris() { }
ここでは Instantiate() 関数でデブリプレハブを生成、いったんGameobject型 の変数に代入します。
その後、その変数を使って、発生場所を指定しています。
❾ void Update() { }
ここでは前回作成した乱数Dを使って、隕石が発生する条件(D==0)から外れたとき(else if )、
さらに乱数が5以下の時(D<=5)、上で指定した CriateDebris() 関数を発動してデブリを生成しています。
最後は下の図のように指定した変数「Debri」にプレハブ「Debris」を指定すればOKです。
いかがでしょうか?デブリが生成されたと思います。
生成されるデブリが多かったら、Random.Range で指定した数値を調整してみましょう。
教室では実際に通って頂いての授業の他、Unityのオンライン授業やオンラインサポートも行っております。お困りごとのある方、ご興味がある方は、ぜひお問い合わせください。
お問い合わせは こちら から。
体験授業のお申込みは こちら から。