毎回狙ったところへまっすぐ飛ぶのも変だと思ったので、銃弾が飛ぶ方向をばらつかせてみました。
// ステートマシンのスクリプト
[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); // 銃弾を発射
上下別々にランダムにばらつかせます。ランダムの値を作るときの範囲に共通の値を使ってみましたが、上下左右に別々の値を設定できたほうが良いかもしれません。
縦と横でばらつき具合を変えるために、横に対する縦の割合を設定できるようにしました。これは縦方向の値を決めるときにだけかけます。すると、平たく横に広がるようにばらけさせたりもできます。
さらに発射角も加えて、弾を少し山なりに飛ばせるようにしました。