【Unity】銃の弾道にばらつきを与える

投稿者: | 2020-08-06

毎回狙ったところへまっすぐ飛ぶのも変だと思ったので、銃弾が飛ぶ方向をばらつかせてみました。

// ステートマシンのスクリプト
[SerializeField] float dispersion = 0.02f; // ばらつき具合
[SerializeField] float verticalToHorizontalRatio = 1.5f; // ばらつきの縦横比
[SerializeField] float angle = 0.05f; // 発射角


//---
// 銃弾を発射する

var b = Instantiate(bullet, player.position + player.forward, player.rotation); // 銃弾を生成
Rigidbody r = b.GetComponent(); // 銃弾のRigidbody


// 縦のばらつき
float v = Random.Range(-dispersion * verticalToHorizontalRatio + angle, dispersion * verticalToHorizontalRatio + angle);
Vector3 dir;

if (v >= 0)
{
    dir = Vector3.Slerp(player.forward, player.up, v);
}
else
{
    dir = Vector3.Slerp(player.forward, -player.up, -v);

}

// 横のばらつき
float h = Random.Range(-dispersion, dispersion);

if (h >= 0)
{
    dir = Vector3.Slerp(dir, player.right, h);
}
else
{
    dir = Vector3.Slerp(dir, -player.right, -h);

}


r.AddForce(dir * 38f, ForceMode.Impulse); // 銃弾を発射

上下別々にランダムにばらつかせます。ランダムの値を作るときの範囲に共通の値を使ってみましたが、上下左右に別々の値を設定できたほうが良いかもしれません。

縦と横でばらつき具合を変えるために、横に対する縦の割合を設定できるようにしました。これは縦方向の値を決めるときにだけかけます。すると、平たく横に広がるようにばらけさせたりもできます。

さらに発射角も加えて、弾を少し山なりに飛ばせるようにしました。

コメントを残す

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