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

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

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

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

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

同じく、Turretの配下に、「2DObject」→「Sprites」→「Square」を追加。名前をMuzzleとして位置、色、サイズを変更。これで砲台っぽくなります。

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

これをスクリプトで実装すると下記の様な感じ。
using System.Collections; using System.Collections.Generic; 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 System.Collections; using System.Collections.Generic; using UnityEngine; public class Bullet : MonoBehaviour { [SerializeField] private float _force; [SerializeField] Rigidbody2D _rb; void Start() { _rb.velocity = transform.up * _force; } }
bulletプレハブにRigidbody2D、作成したスクリプトをアタッチしてパラメータをセット。

Turretのスクリプトを下記に変更。
using System.Collections; using System.Collections.Generic; 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); } } void Shoot() { Instantiate(_bullet, _bulletPos.position, transform.rotation); } }
Muzzleの配下に空のオブジェクトを追加。BulletPosに名前を変更し、弾が出る位置にします。

パラメータをセットして完了。

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