UnityのPrefabでシューティングゲームの敵を作る

前回までで敵の弾と自機の当たり判定までできました。

今回は敵の弾をたくさん作りたいと思います。

Unityで同じものをたくさん作る時はPrefabというのを使うと良いそうなのでやってみます。

Prefabというのは設計図みたいなもので
設計図を工場に持っていくと同じ部品をたくさん作れるそうです。

1.設計図を作る。
ヒエラルキービューの敵弾オブジェクト(Etama)を
プロジェクトビューにD&DするだけでOK。
名前をEtamaPrefabにしました。

ヒエラルキービューのEtamaPrefabは削除する。
設計図があればこれはもういらんらしい。
これ残したままやったら最後におかしくなった。

2.設計図を渡す工場を作る。
プロジェクトビューのcreate→C#script
名前をEtamaFactoryにしました。

3. スクリプトに書き込んでいく。

//最初に
//設計図を入れる箱をGameObject型変数、EtamaPrefabとして宣言。
//ここではまだただの箱。
//実体はプロジェクトビューにおるEtamaPrefabなので
//後でD&Dでアウトレット接続するために最初にpublicをつけておく。
//これがアウトレット接続の接続口になる。

public GameObject EtamaPrefab;

//何秒ごとに弾を生産するか決める変数limitを宣言。
float limit = 1.0f;

//数を数える変数counterを宣言。counterがlimitに達すると新しい弾を作る。
float counter = 0;

//アップデート関数内で
//counterがlimitに達した時の処理
//まずカウンターを0に戻す。
if (this.counter > this.limit) {
this.counter = 0;

//新しい弾の座標を入れるためのGameObject型変数 EtamaMake を宣言。まだただの箱。
//Instantiate関数で弾の分身を作る。
//設計図(EtamaPrefab)を渡すと分身を作ってくれる。
//Instantiate関数は分身をObject型で返そうとするので
//as GameObject でgameobject型に変換する。キャストというそうな。
GameObject EtamaMake = Instantiate (EtamaPrefab) as GameObject;

//最初の弾の出現位置をランダムに決定
int esx = Random.Range (-4, 4);

//EtamaMakeに座標を入れて実体化
EtamaMake.transform.position = new Vector3(esx,7,0);

4.ヒエラルキービューのcreate→create emptyで空のゲームオブジェクトを作成。
名前をEtamaFactoryにする。

5.さっき書いたC#スクリプトのEtamaFactoryを今作った空のゲームオブジェクトにD&Dでアタッチする。

6.ヒエラルキービューのEtamaFactoryをクリックして選択すると
右のインスペクタビューがこんな感じになってるので

プロジェクトビューのEtamaPrefabをそこまでD&Dで接続して
やっとpublic GameObject EtamaPrefab;の
EtamaPrefabが実体化できたみたい。

7.実行してみると弾がたくさん出てきて大成功。
やったー ^^v

/////////////////////////////////////

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EtamaFactory : MonoBehaviour {

public GameObject EtamaPrefab; //設計図を入れる箱をGameObject型変数、EtamaPrefabとして宣言。
//ここではまだただの箱。
//実体はプロジェクトビューにおるEtamaPrefabなので
//後でD&Dでアウトレット接続するために最初にpublicをつけておく。
//これがコンセントの接続口になる。

float limit = 1.0f; //何秒ごとに弾を生産するか決める変数limitを宣言。
float counter = 0; //数を数える変数counterを宣言。counterがlimitに達すると新しい弾を作る。

// Use this for initialization
//void Start () {
//
//}

// Update is called once per frame
void Update () {

this.counter += Time.deltaTime; //Time.deltaTimeでフレーム時間を数えてcounterに代入。

if (this.counter > this.limit) { //counterがlimitに達した時の処理
this.counter = 0; //まずカウンターを0に戻す。

//新しい弾の座標を入れるためのGameObject型変数 EtamaMake を宣言。まだただの箱。
//Instantiate関数で弾の分身を作る。
//設計図(EtamaPrefab)を渡すと分身を作ってくれる。
//Instantiate関数は分身をObject型で返そうとするので
//as GameObject でgameobject型に変換する。キャストというそうな。
GameObject EtamaMake = Instantiate (EtamaPrefab) as GameObject;

int esx = Random.Range (-4, 4); //最初の弾の出現位置をランダムに決定

EtamaMake.transform.position = new Vector3(esx,7,0); //EtamaMakeに座標を入れて実体化

}

}
}

////////////////////////////////////////
ー広告ー



コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です