【Unity】スペースキーで弾を発射する大砲を作成する方法

2021年5月9日Unity

スポンサーリンク

スペースキーで弾を発射する大砲(GameObject)を作る方法を紹介します。

完成動作

スペースキーを押下すると弾が発射される。

やり方(動画)

やり方(ブログ)

大砲(GameObject)を作成

1.例として以下のように組み合わせて砲台を作ります。
 親:Launcher(赤いCube)
 Launcherの子:Muzzle(黄色いCylinder)
 Muzzleの子:FiringPoint(空のGameObject)Muzzleの先端らへんに作成する。下の2番目の画像を参照(実際にはFiringPointの場所から弾が生成されるようにする。
(Muzzleの子オブジェクトとすることで、LauncherやMuzzleの方向を変えても、ちゃんとMuzzleの向いている方向に弾が出るようにできる。)

弾を作成

1.Sphereを作成して、"Bullet"という名前に変更する。
 (わかりやすいようにMaterialで青色にしてます。弾の大きさは良い感じに変える。)

2."Bullet"にRigidBodyを付ける。(弾が飛ぶ動作をRigidBodyを使って実装するため。)

弾をPrefab化

1.作成した"Bullet"をAssetsにドラックアンドドロップして、Prefab化する。

2.Hierarchy欄のBulletを削除にする。(スクリプト上から生成させるようにするため)

スペースキーで弾を発射するスクリプトを作成

1.FireBullet.csという名前のスクリプトを作成して、以下のコードを記載する。

using UnityEngine;

public class FireBullet : MonoBehaviour
{
	[SerializeField]
	[Tooltip("弾の発射場所")]
	private GameObject firingPoint;

	[SerializeField]
	[Tooltip("弾")]
	private GameObject bullet;

	[SerializeField]
	[Tooltip("弾の速さ")]
	private float speed = 30f;

	// Update is called once per frame
	void Update()
	{
		// スペースキーが押されたかを判定
		if (Input.GetKeyDown(KeyCode.Space))
		{
			// 弾を発射する場所を取得
			Vector3 bulletPosition = firingPoint.transform.position;
			// 上で取得した場所に、"bullet"のPrefabを出現させる。Bulletの向きはMuzzleのローカル値と同じにする(3つ目の引数)
			GameObject newBullet = Instantiate(bullet, bulletPosition, this.gameObject.transform.rotation);
			// 出現させた弾のup(Y軸方向)を取得(MuzzleのローカルY軸方向のこと)
			Vector3 direction = newBullet.transform.up;
			// 弾の発射方向にnewBallのY方向(ローカル座標)を入れ、弾オブジェクトのrigidbodyに衝撃力を加える
			newBullet.GetComponent<Rigidbody>().AddForce(direction * speed, ForceMode.Impulse);
			// 出現させた弾の名前を"bullet"に変更
			newBullet.name = bullet.name;
			// 出現させた弾を0.8秒後に消す
			Destroy(newBullet, 0.8f);
		}
	}
}

以下の画像の赤丸を"Local"に変えて、ゲームオブジェクトをクリックするとローカルの回転軸が見れる。

上記のスクリプトのMuzzleのローカルのY軸は赤矢印のところにある緑の矢印のことで、右を向いており、この方向に弾が飛ぶようにスクリプトでやっている。

スクリプトを弾を発射させたいブロック(GameObject)にアタッチ

1.FireBullet.csを弾を発射させたいブロック(Muzzleオブジェクト)にアタッチする。

弾を発射させたいブロック(GameObject)にアタッチしたFireBulletの項目に値を設定

1.MuzzleオブジェクトのInspectorタブの"Fire Bullet"コンポーネントの"Firing Point"にHierarchy欄のFiringPointオブジェクトをドラックアンドドロップして設定する。

2.MuzzleオブジェクトのInspectorタブの"Fire Bullet"コンポーネントの"Bullet"にAssets欄の"Bullet"Prefabをドラックアンドドロップして設定する。   

完成

これでスペースキーを押すと、弾が発射されるようになる。

Unity

Posted by ton