このブログはUnityの初心者向けに、Untiyの機能の使い方、基本のスクリプトファイルの使い方から応用までをご説明しています。中級以上の方に読んでいただきたい内容も随時更新していますので、お時間がある方、検索でここにアクセスされた方はぜひ立ち寄っていってください。
前回の動画「ランダムな座標へ複数のプレハブを生成する方法」に引き続き、クローンを使ってオブジェクトを作成する方法をご紹介します。今回はスペースキーなど、任意のキーを押したときに、用意したミサイルのクローンからインスタンスを生成、さらにRigidbodyに力を与え前方に飛ばすという仕組みを作成します。
下の動画は「ファイブボックス 一分間Unity講座 ランダムな座標へプレハブ生成」 のショート動画です。ご興味がございましたら、こちらの動画もご参照ください。
素材の準備
ミサイルのプレハブ
ヒエラルキー上で 3DObject ⇒ Sphere で球体を配置し、ミサイルの素材を作ります。
サンプルではInspectorから、以下のように調整しました。
■ 名前:Bullet
■ Transform Scale:x:0.3 , y:0.3 , z:0.3
■ Material:赤色のMaterialをセット
さらに Rigidbody コンポーネントを追加しておきましょう。
素材が出来たら、Assetsにドラッグ&ドロップでプレハブ化します。
ヒエラルキーの素材は不要なので、削除しておきます。
砲台
ミサイルが発射される場所になります。 ヒエラルキー上で 3DObject ⇒ Cylinder で円柱状のオブジェクトを配置し、inspectorから以下のように指定します。
■ 名前:Battery(砲台の意味)
■ Transform
Position: x:0 , y:0 , z:-8.5
Rotation:x:50 , y:0 , z:0 (若干上方向を向かせる)
Scale: x:0.3 , y:0.3 , z:0.3
■ CapsulCollider:アクティブのチェックを外し、無効化にします。
※Burretとの衝突を防ぐため
その他、色など任意で調整してください。
ミサイル発射のプログラム
作成済みの、オブジェクトを定期的に生成するスクリプトファイルを確認します。
[SerializeField] GameObject cubePrefab; //cubeのプレハブ
float timer; //経過時間を管理する変数
void Update()
{
timer += Time.deltaTime; //timerに経過時間を加算
if (timer > 1.0f) //timerが1秒を超えたら
{
//Vector3型の変数:pos を宣言、半径5の球体内のランダムな場所を指定
Vector3 pos = Random.insideUnitSphere * 5.0f;
//cubePrefabをposの座標に、回転無しで生成
Instantiate(cubePrefab, pos, Quaternion.identity);
timer = 0; //timerを0リセット
}
}
このプログラムに追記していきましょう。
今回新たに使用するGameObject型
の変数は以下の2つです。
- bulletPrefab – 発射する弾のプレハブ
- battery – 砲台のオブジェクト
ともに[SerializeField]
を宣言しInspectorから指定できるようにします。
[SerializeField] GameObject bulletPrefab, battery; //カンマで区切って2つの変数を宣言
Update関数
では、スペースキーが押されたときにBulletのプレハブを生成し、そのRigidbodyコンポーネント
のAddForceメソッド
を使って前向きの力を加え、前方に飛んでいくようにします。
さらにDestroyメソッド
を使って、作成したオブジェクトを3秒後に削除します。
if (Input.GetKeyDown(KeyCode.Space)) //スペースキーが押されたとき
{
//bulletPrefabのPrefabを生成
GameObject bullet = Instantiate(bulletPrefab,
battery.transform.position, Quaternion.identity);
//Rigidbodyを取得し、AddForceMethodで前向きの力を加える
bullet.GetComponent<Rigidbody>().AddForce(transform.forward * 2000);
Destroy(bullet,3.0f); //3秒後に削除
}
Instantiateメソッド
はクローンからインスタンスを生成する関数です。前回の記事で詳しく説明しているので、そちらもご参照ください。
上のサンプルでは前向きTransform.forward
に2,000の力を加えていますが、任意の力を与えてみてください。
最後は[SerializeField]
で宣言した変数、bulletPrefab、および battery にそれぞれ Burret と Cylinder をAssignします。
これで準備はOKです。起動して正しくミサイルが発射されるのを確認しておきましょう。
ファイブボックスでは、スクラッチやUnityの個別指導のオンラインレッスンを行っています。