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


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

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()
    {
      
    }

    public void firing()
    {
           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行目には弾丸の速度をそれぞれ入れています。

22行目には「firing」という関数があり、このfiringの中に弾丸が発射されるコードか書いてあります。

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


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

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

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

ボタン


コードはできたので弾丸を発射するボタンを作っていきます。

ヒエラルキーから「Button」をクリックしてください。

これでボタンが追加されました。

位置と大きさを調整します。

Buttonから「コンポーネントを追加」をクリックして、「イベントトリガー」を追加します。

追加したら「新しいイベントタイプを追加」をクリックして、「pointerDown」を選びます。

画像のように表示されるので、赤丸の場所にCubeを左クリック長押しで持っていきドロップしてください。

右側の「No Function」の項目をクリックしてさっき作ったスクリプト(NewBehaviourScript)を見つけだし、その中の「firing()」をクリックします。

実際にプレイしてみましょう。ボタンを押してで弾丸を発射できたら完成です。

TOPに戻る

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

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

連射


弾丸を連射できるようにします。

先ほどのスクリプトに以下のコードをコピー&ペーストしてください。

29行目の数字(0.05fと書いている場所)を変更することで連射速度を調整できます。

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

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

    public bool bulletSwith = false;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (bulletSwith == true&&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.05f);
        }
    }

    public void firing()
    {
        if (bulletSwith == false)
        {
            bulletSwith = true;
        }
        else
        {
            bulletSwith = false;
        }
    }

    void ROG()
    {
        Rug = false;
    }
}

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

11行目にはbulletSwithという同じ仕組みの変数を追加しており、これも「false」にしています。

firingにはbulletSwithをtrue、falseに切り替えるコードを新しく追加していて、firingが処理される度にbulletSwithが変化します。

弾丸を発射するコードは「void Update」の中に移動しています。このUpdateは中の処理を連続で行うことができ、これでbulletSwithがtrueの間弾丸が連射されるようになります。

21行目の条件にもう一つ「Rug==false」という条件ができていますね。これはRugがオフの時、つまりfalseの時に処理を行うようになっています。

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

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

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


スクリプトができたら「Event Trigger」の下にある「新しいイベントタイプを追加」をクリックします。

その中から「PointerUP」をクリックします。

画像のようになればOKです。

これで連射機能完成です。

ボタンを押すと発射し、離すと撃つのをやめます。

拡散


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

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

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

それぞれのCubeの角度をすこしだけズラします。

Event Triggerで追加したCube分ボタンの判定を入れます。

動画のように弾丸が拡散すればOKです。

TOPに戻る

装弾数

銃に装弾数をつけて、装弾数が0になったら撃てなくします。以下のコードをコピー&ペーストしてください。

12行目の「Numberbullet」の値30が装弾数なので好きな値にしてみてください。

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

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

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

    // Update is called once per frame
    void Update()
    {
    }

    public void firing()
    {
        if (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);

            Numberbullet -= 1;

        }
    }

    public void Reload()
    {
        Numberbullet = 30;
    }

    void ROG()
    {
        Rug = false;
    }
}

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

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

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

38行目には「Reload」という関数があり、Numberbulletの数を30にするというコードが書いてあります。このReloadを読み込むことでリロードができますね。


コードができたら弾丸を発射するボタンを右クリックで複製します。

複製したボタンをリロードするボタンにします。

適当な位置にボタンを移動させます。(わかりやすいように文字をいれています)

リロード用のボタンのEvent TriggerからReload()をクリックします。

これでOKです。動画では弾丸を発射すると右側のNumberbulletの数字が一つ減っていき、0になると弾丸がでなくなります。リロードのボタンを押すと数字が30に戻り再び撃てます。

TOPに戻る

Unity人気の本

7件のコメント

コメントを残す

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