このブログはUnityの初心者向けに、Untiyの機能の使い方、基本のスクリプトファイルの使い方から応用までをご説明しています。中級以上の方に読んでいただきたい内容も随時更新していますので、お時間がある方、検索でここにアクセスされた方はぜひ立ち寄っていってください。
一分間Unity講座のまとめはこちらから。
今回は2Dのプロジェクトで一定間隔ごとに弾を撃ち続ける方法のご説明です。敵や味方の弾幕に使えそうです。
今回は Time.deltaTime を使って時間を計測し、指定した時間になったら弾を発射する方法をご説明します。
下の動画は「ファイブボックス 一分間Unity講座 ミサイルを当てた相手を消す方法」 のショート動画です。ご興味がございましたら、こちらの動画もご参照ください。
素材の準備
■ Player
ヒエラルキー上で 2DObject ⇒ Sprite ⇒ Triangle で三角形のオブジェクトを配置
名前をPlayerにしておきます。
※今回の課題では動きはないので、これだけでOKです。
■ Bullet
上で作成したPlayerと同様、2DObject ⇒ Sprite ⇒ Circle で弾の素材を作ります。
名前を Bullet にしておきます。さらに以下の項目を修正
Transformコンポーネント
Scale を0.3倍に指定SpriteRendererコンポーネント
Color に任意の色を指定(サンプルではオレンジ)Rigidbodyコンポーネント
【追加】 GravityScale を 0 にして重力を無し
最後はAssetsフォルダにドラッグ&ドロップでプレハブにしておきます
ヒエラルキー上のBulletは不要なので削除しておきます。
スクリプトファイル
弾を発射するプログラム「PlayerShot」を作成します。名前は任意です。
PlayerShotには以下のコードを記述します。
[SerializeField] GameObject bulletPrefab; //Bulletのプレハブ
float timer; //経過時間を管理するタイマー
void Update()
{
timer += Time.deltaTime; //timerに経過時間を加算
if (timer > 0.2f) //timerが0.2秒を超えたら
{
//弾を自分の場所に生成し、bullet という名前で変数化
GameObject bullet = Instantiate(bulletPrefab, transform.position,
uaternion.identity);
//bullet からRigidbody2Dを取得し、上向き×200の力を加える
bullet.GetComponent<Rigidbody2D>().AddForce(transform.up * 200);
Destroy(bullet,2.0f); //2秒後にbulletを削除
timer = 0; //timerを0でリセット
}
}
Time.deltaTime
Update関数やCollisionStay関数などの繰り返し呼び出される関数で使用される、直前のフレームから現在のフレームまでにかかった時間を示します。
高フレームレートの場合、deltaTime の値は小さくなり、低フレームレートの場合は値が大きくなります。フレームレートが違っても、Time.deltaTime を累積していくことで、リセットされてからの経過時間を図ることができます。
今回は比較的簡単なスクリプトファイルです。
作成したスクリプトファイルを Player にアタッチ、変数 BulletPrefab には作成済みの「Bullet」のプレハブをAssignします。
これでプレイすると、0.2秒に1発ずつ弾を撃ち続けるオブジェクトができています。
ファイブボックスでは、スクラッチやUnityの個別指導のオンラインレッスンを行っています。