前回までで敵の弾と自機の当たり判定までできました。
今回は敵の弾をたくさん作りたいと思います。
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に座標を入れて実体化
}
}
}
////////////////////////////////////////
ー広告ー