Unityで弾を発射したい場合に、弾丸のオブジェクトをあらかじめ大量作っておくのでしょうか? 確かに現実世界ではそうなりますが、Unityでは再利用可能なPrefabを使います
簡単にGameObjectからたくさんの弾丸が発射されるような例を作ってみます
Prefab
prefabとはご存知のプレハブ住宅で言うところのプレハブです。
fabricate の「製造、制作」にpreと言う前置詞がついて、事前に作成したものを指す訳です。プレハブ住宅のようにあらかじめ作っておいて、たくさん量産するのですね。納得…
Cubeを土台としてCapsuleを銃身に、弾をSphereで作って行きます。
Cubeで土台作り
Gunの土台を作ります。「GameObject」「3D Object」「Cube」からCubeを作成して、位置を [0, 0, 0] Scaleを [2, 2, 2] 辺りに調整します。
銃身としてのCapsule
銃身に見立てたCapsuleを設置、z方向に1.5ずらします。
MuzzleはEmptyのGameObject
Muzzle、銃口を想定しています。これは弾丸が発射される位置を特定するためにGameObjectの「Create Empty」で作った空のオブジェクトで、Capsuleの中に位置を設定します。
弾丸:bullet
bullet、弾丸。Prefabで丸を作るための雛型でSphereで作成します。Scaleは 0.5,0.5,0.5 と設定、後で削除しますので場所は適当です。
Sphereの名前をbulletに変えて「Component」「Physics」から「Rigidbody」を設定。Use Gravityはここではチェックを外します。
Main Cameraを調整して弾丸の飛び出すのがわかるようにします。
SceneのCamera Previewで位置やローテーションを合わせます。
Prefab 作成
prefabの作り方は色々あるようですが簡単に、HierarchyにあるGameObjectをドラッグ&ドロップでAssetsに置くとPrefabになります。
Zキーで発射するScript
キーボードの「z」を押すと弾丸が発射されるようにコーディングします
ProjectのCreateから「C# Script」で
Shooting.cs を作ります
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Shooting : MonoBehaviour { // bullet prefab public GameObject bullet; // 弾丸発射点 public Transform muzzle; // 弾丸の速度 public float speed = 1000; // Use this for initialization void Start () { } // Update is called once per frame void Update () { // z キーが押された時 if (Input.GetKeyDown(KeyCode.Z)){ // 弾丸の複製 GameObject bullets = Instantiate(bullet) as GameObject; Vector3 force; force = this.gameObject.transform.forward * speed; // Rigidbodyに力を加えて発射 bullets.GetComponent<Rigidbody>().AddForce(force); // 弾丸の位置を調整 bullets.transform.position = muzzle.position; } } } |
これをCubeにドラッグ&ドロップ
Inspector にShooting (Script)が追加されます。
Shooting (Script) には
Bullet
Muzzle
がそれぞれNoneになっているので、HierarchyのMuzzleと
Assetsのbullet.prefabをドラッグ&ドロップします。
Hierarchyのbulletはいりませんので消去します。
これでGameシーンに切り替えて
「Z」キーを押すと弾丸が発射されます。
Reference:
プレハブ – Unity マニュアル