今回はUnityで砲撃機のようなものを作成してみます。
イメージとしては固定砲台。キーボードの左右キーで銃身が動いて、スペースキーで弾が出る感じです。
はじめに
Unityのバージョンは2021.3.3f1です。
下記の様な、左右キーで銃身が動いて、スペースキーで弾が出る砲台を作っていきます。
![](https://nosystemnolife.com/wp-content/uploads/2022/11/20221101016.gif)
実装開始
まずは矢印キーで動く砲台を作り、次にスペースキーで弾が出るようにします。
砲台を作成
「2DObject」→「Sprites」→「Square」を追加。
![](https://nosystemnolife.com/wp-content/uploads/2022/11/20221101001.png)
名前をGroundに変更。位置とスケール、色を変更して地面にします。
![](https://nosystemnolife.com/wp-content/uploads/2022/11/20221101002-1024x693.png)
「2DObject」→「Sprites」→「Circle」を追加。
![](https://nosystemnolife.com/wp-content/uploads/2022/11/20221101003.png)
名前をTurretに変更し、位置、DrawModeを変更し、サイズを変更。地面の後ろに配置して半円になるように。
![](https://nosystemnolife.com/wp-content/uploads/2022/11/20221101004.png)
同じく、Turretの配下に、「2DObject」→「Sprites」→「Square」を追加。名前をMuzzleとして位置、色、サイズを変更。これで砲台っぽくなります。
![](https://nosystemnolife.com/wp-content/uploads/2022/11/20221101005.png)
下記の様にTurretオブジェクトのRotationのZを変更すると、配下にあるMuzzleがTurretの中心を軸に回転します。
![](https://nosystemnolife.com/wp-content/uploads/2022/11/20221101006.png)
これをスクリプトで実装すると下記の様な感じ。
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オブジェクトにアタッチして、パラメータを入力。動くスピードと最大角度をセット。
![](https://nosystemnolife.com/wp-content/uploads/2022/11/20221101008.png)
これで左右キーの入力で砲身が動くようになります。
スペースキーで玉を打ち出し
「2DObject」→「Sprites」→「Circle」を追加。名前をbulletにして、スケールを変更しておきます。
![](https://nosystemnolife.com/wp-content/uploads/2022/11/20221101009.png)
プレハブ化します。
![](https://nosystemnolife.com/wp-content/uploads/2022/11/20221101010.png)
下記のスクリプトを作成。
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、作成したスクリプトをアタッチしてパラメータをセット。
![](https://nosystemnolife.com/wp-content/uploads/2022/11/20221101012.png)
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に名前を変更し、弾が出る位置にします。
![](https://nosystemnolife.com/wp-content/uploads/2022/11/20221101014.png)
パラメータをセットして完了。
![](https://nosystemnolife.com/wp-content/uploads/2022/11/20221101015.png)
これでスペースキーで弾が出るようになります。