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

投稿者: | 2020-08-06

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

  1. // ステートマシンのスクリプト
  2. [SerializeField] float dispersion = 0.02f; // ばらつき具合
  3. [SerializeField] float verticalToHorizontalRatio = 1.5f; // ばらつきの縦横比
  4. [SerializeField] float angle = 0.05f; // 発射角
  5.  
  6.  
  7. //---
  8. // 銃弾を発射する
  9.  
  10. var b = Instantiate(bullet, player.position + player.forward, player.rotation); // 銃弾を生成
  11. Rigidbody r = b.GetComponent(); // 銃弾のRigidbody
  12. // 縦のばらつき
  13. float v = Random.Range(-dispersion * verticalToHorizontalRatio + angle, dispersion * verticalToHorizontalRatio + angle);
  14. Vector3 dir;
  15. if (v >= 0)
  16. {
  17. dir = Vector3.Slerp(player.forward, player.up, v);
  18. }
  19. else
  20. {
  21. dir = Vector3.Slerp(player.forward, -player.up, -v);
  22. }
  23. // 横のばらつき
  24. float h = Random.Range(-dispersion, dispersion);
  25. if (h >= 0)
  26. {
  27. dir = Vector3.Slerp(dir, player.right, h);
  28. }
  29. else
  30. {
  31. dir = Vector3.Slerp(dir, -player.right, -h);
  32. }
  33. r.AddForce(dir * 38f, ForceMode.Impulse); // 銃弾を発射

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

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

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

コメントを残す

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