実現したいこと
Unity3Dで全方位の射撃(Prefab化した弾丸を射出)の作成をしています。
1あるいは2方向であれば、空オブジェクトを設置してそこに弾丸発射用スクリプトをアタッチすればいいのですが、全方位となあると、空オブジェクトをキャラクターの周りに大量につけるのは厳しいと考えました。
そこで、キャラクター周辺角度○○ずつに弾を発射( for (int rad = 0; rad < 360; rad += 6) を用いたりして発射)すればいいのかと考えましたが、このやり方ですと全方位と言いつつも、平面上にしか弾丸を発射できません。
どなたか空間上で全方位射撃をするゲームを作った方や全方位射撃ができるアイデアをお持ちの方はいらっしゃいませんか?
どうかよろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
思いついた手としては...
- Random.onUnitSphereを弾の数だけ取得して、その方向に撃つ...これが手軽だと思いますが、射出方向がランダムになってしまって見栄えが悪いかもしれません。
- 3Dソフトウェアのサブディビジョン機能などを用い、多角形を分割してそれっぽい配置の頂点を持つモデルを作ってUnityに読み込んでおき、メッシュのverticesを調べてその方向に撃つ...外部ソフトであらかじめメッシュを作る形になるので、実行時に弾数を任意に決めたい場合には不適かもしれません。
- 任意個数の点の球面上均等配置を求め、その方向に撃つ...研究分野によっては、球面上の点の最適配置が欲しいことがあるそうです。多数の点を球面上に一様分布させる | blog.PanicBlanket.comなどの記事がご参考になるかと思います。他にも球面上の点が互いに反発する様子をシミュレーションして均等で安定な配置をとらせる方法もあるようですね(研究概要|大阪大学 Theory for Laser Plasma(TLP)グループ (レーザープラズマ理論) レーザーエネルギー学研究センター (3) 自己組織化アルゴリズムによるレーザー核融合照射配位の最適化)。
[追記]
あまり気負わずに、いろいろな思いつきを試してみるといいのではないでしょうか。
ご質問者さんのおっしゃる「キャラクター周辺角度○○ずつに弾を発射」もいい手だと思います。
これを水平方向だけでなく緯度・経度の2方向について応用すれば全方向に対応できるでしょう。
たとえばこんな感じに...
C#
1using UnityEngine; 2 3public class AllrangeCannon : MonoBehaviour 4{ 5 public float BulletSpeed = 10.0f; 6 public GameObject BulletPrefab; 7 8 public int HorizontalBulletCount = 12; 9 public float MuzzleOffset = 2.0f; 10 11 private void Shot() 12 { 13 var angleStep = 360.0f / this.HorizontalBulletCount; 14 this.ShotHorizontal(0.0f, this.HorizontalBulletCount); // 赤道方向に弾を発射 15 for (var angle = angleStep; angle < 90.0f; angle += angleStep) 16 { 17 this.ShotHorizontal(angle, this.HorizontalBulletCount); // 北緯angle°に弾を発射 18 this.ShotHorizontal(-angle, this.HorizontalBulletCount); // 南緯angle°に弾を発射 19 } 20 } 21 22 private void ShotHorizontal(float angleV, int maxCount) 23 { 24 angleV *= Mathf.Deg2Rad; // 緯度を弧度法による角度に変換 25 var cosAngleV = Mathf.Cos(angleV); 26 var sinAngleV = Mathf.Sin(angleV); 27 var count = (int)(cosAngleV * maxCount); // 緯度に合わせて弾数を減らす...緯線の長さは緯度のコサインに比例する 28 for (var i = 0; i < count; i++) 29 { 30 var angleH = (2.0f * Mathf.PI * i) / count; // 弧度法による経度 31 var cosAngleH = Mathf.Cos(angleH); 32 var sinAngleH = Mathf.Sin(angleH); 33 34 // 緯度、経度からVector3による方角を算出 35 var x = sinAngleH * cosAngleV; 36 var y = sinAngleV; 37 var z = cosAngleH * cosAngleV; 38 var direction = new Vector3(x, y, z); // この方角に弾を1発発射したい 39 40 // 以下、弾の発射方法についてはご質問者さんの設計に合わせて変えてみてください 41 var bullet = Instantiate( 42 this.BulletPrefab, 43 this.transform.position + (direction * this.MuzzleOffset), 44 Quaternion.LookRotation(direction)); 45 var rigidbody = bullet.AddComponent<Rigidbody>(); 46 rigidbody.useGravity = false; 47 rigidbody.constraints = RigidbodyConstraints.FreezeRotation; 48 rigidbody.AddForce(direction * this.BulletSpeed, ForceMode.VelocityChange); 49 } 50 } 51 52 private void Update() 53 { 54 if (Input.GetKeyDown(KeyCode.Space)) 55 { 56 this.Shot(); 57 } 58 } 59}
投稿2018/05/13 21:41
編集2018/05/14 22:36総合スコア10807
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/14 07:19
2018/05/19 10:33