【Unity】武器やマガジンを拾って使う

投稿者: | 2021-04-22

銃とマガジンを拾って撃ってみました。

弾の種類を切り替えるでは、プレイヤーの頭につけるスクリプトに武器のスクリプトを持たせ、さらに武器にマガジンを持たせることで射撃できるようになります。

この武器やマガジンをセットするメソッドを使えば、銃やマガジンを拾う処理を簡単に作れます。

まず、シーンに配置されている銃やマガジンにはスクリプトやタグが付いています。

プレイヤーの頭からレイを飛ばして、このタグによってアイテムの種類を判別し、銃ならプレイヤーにセット、マガジンならプレイヤーが持っている銃にセットするだけです。

// プレイヤーの頭につけるスクリプト
using UnityEngine;
using UnityEngine.UI;

public class Player2 : MonoBehaviour
{
    [SerializeField] SmallArms weapon;
    [SerializeField] Text centerText;
    bool foundItem;

    public void SetWeapon(SmallArms w)
    {
        weapon = w;

        // 武器を非アクティブにする
        w.gameObject.SetActive(false);
    }

    public SmallArms GetWeapon()
    {
        return weapon;
    }

    static Player2 instance;
    public static Player2 GetInstance()
    {
        return instance;
    }

    // Start is called before the first frame update
    void Start()
    {
        instance = this;
        centerText.text = "";
    }

    // Update is called once per frame
    void Update()
    {
        // 視線のレイが当たった時
        if(Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, Mathf.Infinity, ~(1 << 9)))
        {
            centerText.text = hit.collider.tag;

            if (Input.GetMouseButtonDown(0))
                {
                // 銃タグが付いているとき
                if (hit.collider.tag == "Weapon")
                {
                    // 武器スクリプトを取得
                    SmallArms weapon = hit.collider.GetComponent<SmallArms>();

                    // 取得できたらセット
                    if (weapon != null) SetWeapon(weapon);
                    foundItem = true;
                }
                // マガジンタグのとき
                else if (hit.collider.tag == "Magazine")
                {
                    // マガジンスクリプトを取得
                    Magazine magazine = hit.collider.GetComponent<Magazine>();

                    // 取得できたとき
                    if (magazine != null)
                    {
                        // 銃をもっていればマガジンをセット
                        if (weapon != null) weapon.SetMagazine(magazine);
                    }

                    foundItem = true;

                }
                else
                {

                    centerText.text = "";
                    foundItem = false;

                }
            }

        }
        else
        {
            centerText.text = "";
            foundItem = false;
        }

        // レイがアイテムに当たってないとき
        if (!foundItem)
        {
            // 左クリックで攻撃
            if (Input.GetMouseButtonDown(0))
            {
                if (weapon != null) weapon.StartAttack();

            }
            // 離すと攻撃をやめる(マシンガン等)
            else if (Input.GetMouseButtonUp(0))
            {
                if (weapon != null) weapon.StopAttack();
            }
        }
      
    }
}

セットした武器やマガジンが見えなくなるように、オブジェクトを非アクティブにしています。非アクティブにしても、スクリプトは動いているようです。

// 銃のスクリプト
using UnityEngine;

public class SmallArms : Weapon
{
    [SerializeField] Magazine magazine;

    public void SetMagazine(Magazine m)
    {
        magazine = m;
        m.gameObject.SetActive(false);
    }
// ...

マガジンを左クリックしても、武器を持っていないときはセットしません。また、アイテムが揃っていなかったり、アイテムにレイが当たっているときに左クリックしても弾を発射しません。

発射した弾が変な方向に跳ぶときは、弾がプレイヤーに衝突しているかもしれません。プレイヤーと弾にレイヤーを設置して、Profect Settingsから両者の衝突が無視されるように設定できます。

プレイヤーの頭
銃弾のプレハブ
Edit > Project Settings... > Physics

コメントを残す

メールアドレスが公開されることはありません。