[Unity] FPSで銃から弾を発射する方法 PC用(画像あり)


Unityで銃から弾丸を発射する方法を書いていきます。

連射・拡散などの撃ち方や装弾数・リロードなども解説しています。

PC用スマホ用両方解説しています。

スマホ用はこちら

目次

弾丸を発射する(PC用)

いろいろな撃ち方にしてみる

装弾数


弾丸を発射する(PC用)

アセットのダウンロード


銃をアセットストアでダウンロードし、弾丸を発射できるようにします。

そのためにまずは銃の素材を入れるところからはじめます。ここでは「M9 HD」というアセットを使用します。

インポートしたら銃をプレイヤーのカメラの子にしましょう。自分の操作キャラクターの中に入れれば大丈夫です。

画像のようにカメラの下に銃があればOKです。

銃の位置を調整して画面にうつるようにしましょう。

発射口


銃を配置できたので、これから弾丸を発射できるようにしていきます。まずは弾丸を発射する「入り口」が必要なのでそれを作っていきます。ヒエラルキーからキューブを追加してください。

Cubeは銃の子にしてください。

Cubeの位置と大きさを調整して銃の先端に持っていきます。

ここから弾丸が発射されるようにします。

Cubeは「Mesh Renderer」のチェックを外しましょう。これで透明にできます。

さらに「Box Collider」の「トリガーにする」にチェックをつけましょう。これでこのオブジェクトの当たり判定がなくなります。

弾丸


発射する弾丸を作っていきます。ヒエラルキーから「スフィア」を追加してください。

 追加した「Sphere」を左クリック長押しでプロジェクトに移動させます。画像のようになればいいです。

プロジェクトに追加できたらヒエラルキーの「Sphere」は削除しましょう。

プロジェクトにある「Sphere」は「Sphere Collider」内の「トリガーにする」のチェックを外しましょう。

次に「コンポーネントを追加」から「Rigidbody」を追加します。これは重力をオブジェクトにつけることができます。

これを弾丸にしますが、今のままでは大きすぎます。なのでTransformの値を調整して小さくしましょう。個人的に大きさをX,Y,Z全て0.1にするのが丁度いいと思いました。

スクリプト


ここからプログラムを組んで実際に弾丸を発射できるようにしていきます。

プロジェクトから「C#スクリプト」をクリックしてください。このスクリプトに弾丸発射のコードを書いていきます。

スクリプトのコードは以下をそのままコピー&ペーストしてください。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
    public GameObject bullet;
    public float bulletSpeed;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButton(0))
        {
            GameObject Bullet = (GameObject)Instantiate(bullet, transform.position, Quaternion.Euler(transform.parent.eulerAngles.x, transform.parent.eulerAngles.y, 0));
            Rigidbody bulletRb = Bullet.GetComponent<Rigidbody>();
            bulletRb.AddForce(transform.forward * -bulletSpeed);
            Destroy(Bullet, 3.0f);
        }
    }
}

スクリプトの7行目では弾丸のオブジェクト、8行目には弾丸の速度をそれぞれ入れています。

18行目にはマウスが左クリックされたら{}の中を処理するコードが書かれています。

{}内の処理はそれぞれ、20行目で弾丸が発射される向き、21行目で弾丸の重力、22行目で弾丸のスピードの計算、23行目に弾丸が発射されてから消える時間(コードでは3秒後)が書かれています。


スクリプトができたら先ほど作った発射口(Cube)に左クリック長押しでドロップします。

Cubeにスクリプトの項目ができていればOKです。

スクリプトの「Bullet」にプロジェクトに追加した「Sphere」を左クリック長押しでドロップします。下の「Bullet Speed」は弾丸の速度なので好きな値を入れて大丈夫です。

実際にプレイしてみましょう。左クリックで弾丸を発射できたら完成です。

TOPに戻る

いろいろな撃ち方にしてみる

単発や、弾丸を拡散させる方法を書いていきます。

単発


先ほどのスクリプトから20行目の「if (Input.GetMouseButton(0))」を「if (Input.GetMouseButtonDown(0))」に変更すると単発にできます。

「if (Input.GetMouseButton(0))」ではキーを押している間処理を行うのでマシンガンのように連射されますが、「Down」はキーを押した時に一度だけ処理を行うので、押すたびに一発ずつ発射されるようになります。

        if (Input.GetMouseButtonDown(0))

また、以下のようにRugという変数を使うことで連続で撃つ場合に感覚を開けることができます。

27行目の数字で感覚の時間を調整できます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
    public GameObject bullet;
    public float bulletSpeed;
    bool Rug = false;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0)&&Rug==false)
        {
            GameObject Bullet = (GameObject)Instantiate(bullet, transform.position, Quaternion.Euler(transform.parent.eulerAngles.x, transform.parent.eulerAngles.y, 0));
            Rigidbody bulletRb = Bullet.GetComponent<Rigidbody>();
            bulletRb.AddForce(transform.forward * -bulletSpeed);
            Destroy(Bullet, 3.0f);

            Rug = true;
            Invoke("ROG", 0.5f);
        }
    }
    void ROG()
    {
        Rug = false;
    }
}

9行目に追加された「bool Rug = false;」はRugという変数のスイッチがオフになっている状態です。「false」がオフという意味になっており、これを「true」にすることでスイッチをオンにできます。

19行目の左クリックしたら処理を行う条件のところに新しく「Rug==false」という条件ができていますね。これはRugがオフの時、つまりfalseの時に処理を行うようになっています。

26行目でRugをtrueにしていますね。つまり弾丸を一度発射するとRugがtrueとなり、Rugがfalseの時に処理を行うという条件が達成されなくなります。

27行目にはROGという関数を0.5秒後に実行するというコードが書いてあります。ROGは30行目にありますね。この関数にはRugをfalseにするというコードが書いてあり、これにより銃が0.5秒毎に連射されるようになります。

ここの数値を変更することで自分の好きな連射速度にすることができます。

拡散


ショットガンのように弾丸を拡散させる方法を説明します。

弾丸の発射口(Cube)を右クリックして「複製」を選びます。

拡散させたい数だけ複製しましょう。

それぞれのCubeの角度をすこしだけズラします。これをしないと弾丸の拡散が分かりにくいです。

弾丸が拡散されます。ズラした角度によって色々な拡散の仕方ができるので自分の好きな銃にしてみましょう。

TOPに戻る

装弾数

銃に装弾数をつけて、装弾数が0になったら撃てなくします。

⚪︎がついている箇所が新しく追加するコードです。コピー&ペーストしたら⚪︎は消しましょう

11行目の「Numberbullet」の値30が装弾数なので好きな値にしてみてください。キーのRでリロードできるようにしています。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
    public GameObject bullet;
    public float bulletSpeed;
    bool Rug = false;

    public int Numberbullet = 30;⚪︎
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0)&&Rug==false&&Numberbullet>0)⚪︎
        {
            GameObject Bullet = (GameObject)Instantiate(bullet, transform.position, Quaternion.Euler(transform.parent.eulerAngles.x, transform.parent.eulerAngles.y, 0));
            Rigidbody bulletRb = Bullet.GetComponent<Rigidbody>();
            bulletRb.AddForce(transform.forward * -bulletSpeed);
            Destroy(Bullet, 3.0f);

            Rug = true;
            Invoke("ROG", 0.05f);
            Numberbullet -= 1;⚪︎
        }
        if (Input.GetKeyDown(KeyCode.R))⚪︎
        {⚪︎
            Numberbullet = 30;⚪︎
        }⚪︎
    }
    void ROG()
    {
        Rug = false;
    }
}

11行目に装弾数が書いてあり、ここの数値で装弾数を決めます(Numberbulletが装弾数です)。

21行目に新しい条件「Numberbullet>0」を追加しました。これはNumberbulletが0よりも大きい時に処理を行うという意味で、これにより装弾数が0なら弾丸が発射されないようになります。

30行目にNumberbulletの数値を-1するコードが書いてあります。これで弾丸が発射される度にNumberbulletの数値が下がっていきますね。

32行目にはキーの「R」を押すと34行目でNumberbulletを30にするコードが書いています。つまりRキーを押すことでリロードが可能になります。


動画の右側にあるNumberbulletの値が銃を撃つごとに減っています。0になったら撃てなくなり、Rキーを押すとリロードされます。

TOPに戻る

Unity人気の本

1件のコメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です