一人称視点で銃を撃つ銃を撃ってみます。
スタンダードアセットの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」のレイヤーを持つオブジェクト同士が衝突しなくなります。
下向きにも玉が飛ぶようになりました。