オブジェクトを回転させて砲撃機のように弾を発射【Unity】

今回は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に名前を変更し、弾が出る位置にします。

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

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

タイトルとURLをコピーしました