今回はUnity2Dで砲撃台のようなものを作成してみます。
イメージとしては固定砲台です。キーボードの左右キーで銃身が動いて、スペースキーで銃身の先から弾が出る感じです。
はじめに
Unityのバージョンは2022.3.14f1です。
下記の様な、左右キーで銃身が動いて、スペースキーで弾が出る砲台を作っていきます。

実装開始
まずは矢印キーで動く砲台を作り、次にスペースキーで弾が出るようにします。
砲台を作成
「2DObject」→「Sprites」→「Square」を追加。

名前をGroundに変更。位置とスケール、色を変更して地面にします。

「2DObject」→「Sprites」→「Circle」を追加。

名前をTurretに変更し、位置、DrawModeを変更し、サイズを変更。地面の後ろに配置して半円になるようにします。

Turretの配下に、「2DObject」→「Sprites」→「Square」を追加。名前をMuzzleとします。

Muzzleの位置、色、サイズを変更します。これで砲台っぽくなります。

下記の様にTurretオブジェクトのRotationのZを変更すると、配下にあるMuzzleがTurretの中心を軸に回転します。

スクリプトの作成
銃身を動かすのをスクリプトで実装すると下記の様な感じになります。
using UnityEngine; public class Turret : MonoBehaviour { [SerializeField] private float _rotateSpeed; [SerializeField] private float _maxAngle; private float angle; private void Update() { float InputX = Input.GetAxisRaw("Horizontal"); if (InputX != 0) { angle -= _rotateSpeed * InputX * Time.deltaTime; if (angle < -_maxAngle) angle = -_maxAngle; else if (angle > _maxAngle) angle = _maxAngle; transform.rotation = Quaternion.Euler(0, 0, angle); } } }
Turretオブジェクトにスクリプトを追加して、パラメータを入力します。動くスピードと最大角度です。

これで左右キーの入力で砲身が動くようになります。
スペースキーで玉を打ち出し
「2DObject」→「Sprites」→「Circle」を追加。名前をbulletにして、スケールを変更しておきます。

弾を発射するスクリプトは下記です。
using UnityEngine; public class bullet : MonoBehaviour { [SerializeField] private float _force; private Rigidbody2D rb; private void Awake() { rb = GetComponent<Rigidbody2D>(); } void Start() { rb.velocity = transform.up * _force; } }
bulletにRigidbody2Dを追加してGravityScaleを0に、作成したスクリプトを追加してパラメータをセットします。

Turretのスクリプトを下記に変更。
using UnityEngine; public class Turret : MonoBehaviour { [SerializeField] private float _rotateSpeed; [SerializeField] private float _maxAngle; [SerializeField] private GameObject _bullet; [SerializeField] private Transform _bulletPos; private float angle; private void Update() { if (Input.GetKeyDown(KeyCode.Space)) Shoot(); float InputX = Input.GetAxisRaw("Horizontal"); if (InputX != 0) { angle -= _rotateSpeed * InputX * Time.deltaTime; if (angle < -_maxAngle) angle = -_maxAngle; else if (angle > _maxAngle) angle = _maxAngle; transform.rotation = Quaternion.Euler(0, 0, angle); } } private void Shoot() { Instantiate(_bullet, _bulletPos.position, transform.rotation); } }
bulletはプレハブ化して削除しておきます。

Muzzleの配下に空のオブジェクトを追加して、名前をBulletPosに、弾が出る位置にします。

Turretオブジェクトにパラメータをセットして完了。

これでスペースキーで弾が出るようになります。