一人称視点で銃を撃つ

投稿者: | 2019-12-15

一人称視点で銃を撃つ銃を撃ってみます。

スタンダードアセットのFPSコントローラをシーンに配置します。

FPSコントローラには頭にカメラが付いています。

このカメラに新しいスクリプトを付けます。

MainCameraは無効にします。

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

public class fpsScript : MonoBehaviour
{
    public GameObject ball;
    Rigidbody rb_ball;
    public float thrust = 100f;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0)) // マウスの左クリックをしたとき
        {
            rb_ball = Instantiate(ball, transform.position, transform.rotation).GetComponent<Rigidbody>(); // 玉を生成
            rb_ball.AddForce(transform.forward * thrust, ForceMode.Impulse); // カーソルの方向に力を一度加える
        }
    }
}

マウスを動かすとこのカメラの向きが変わるので、transform.forwardを使ってカメラの正面に玉を飛ばせばいいだけです。

飛ばす玉のプレハブを作って、コライダーとリジッドボディ、スクリプトを付けて、FPSコントローラのカメラのスクリプトにアタッチしています。

玉のスピードが上がっても物体を通り抜けないように、リジッドボディのCollision DetectionはContinuous Dynamicに設定しています。

玉に加える力を上げると銃弾のように高速になります。

玉のスクリプトでは、玉が増えすぎてゲームが重くならないように、玉のy座標が-10をきると削除されるようにしています。

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

public class ballScript : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (transform.position.y < -10f)
        {
            Destroy(gameObject);
        }
    }
}

(追記)
このままでは、下向きに発射したときもまっすぐ前に飛んでしまいます。これは、発射した玉がプレイヤーの胴体にあたっているのが原因のようです。
なので、玉が胴体に衝突しないようにします。

シーン内のオブジェクトを選択して、インスペクタでレイヤーのドロップダウンメニューを開いて、Add Layer…をクリックします。

ここに新しいレイヤー名を2つ入力します。「Player」と「Ball」を追加しました。

FPSコントローラの胴体を選択します。

今度はAdd Layer…ではなく、「Player」を選択します。

Ballのプレハブでは、「Ball」のレイヤーを選択します。

Edit -> Project Settings を開きます。

Physicsの設定の下部のマトリックスで、「Player」と「Ball」の交点のチェックを外します。

ここでレイヤー同士が衝突するかどうかを設定できます。チェックを外したので「Player」と「Ball」のレイヤーを持つオブジェクト同士が衝突しなくなります。

下向きにも玉が飛ぶようになりました。

コメントを残す

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