回答編集履歴

1

アドバイスを追記

2018/05/14 22:36

投稿

Bongo
Bongo

スコア10807

test CHANGED
@@ -5,3 +5,141 @@
5
5
  - 3Dソフトウェアのサブディビジョン機能などを用い、多角形を分割してそれっぽい配置の頂点を持つモデルを作ってUnityに読み込んでおき、メッシュの[vertices](https://docs.unity3d.com/ja/current/ScriptReference/Mesh-vertices.html)を調べてその方向に撃つ...外部ソフトであらかじめメッシュを作る形になるので、実行時に弾数を任意に決めたい場合には不適かもしれません。
6
6
 
7
7
  - 任意個数の点の球面上均等配置を求め、その方向に撃つ...研究分野によっては、球面上の点の最適配置が欲しいことがあるそうです。[多数の点を球面上に一様分布させる | blog.PanicBlanket.com](http://blog.panicblanket.com/archives/3778)などの記事がご参考になるかと思います。他にも球面上の点が互いに反発する様子をシミュレーションして均等で安定な配置をとらせる方法もあるようですね([研究概要|大阪大学 Theory for Laser Plasma(TLP)グループ (レーザープラズマ理論) レーザーエネルギー学研究センター (3) 自己組織化アルゴリズムによるレーザー核融合照射配位の最適化](http://www.ile.osaka-u.ac.jp/research/csn/summary.html#list03))。
8
+
9
+
10
+
11
+ [追記]
12
+
13
+ あまり気負わずに、いろいろな思いつきを試してみるといいのではないでしょうか。
14
+
15
+ ご質問者さんのおっしゃる「キャラクター周辺角度○○ずつに弾を発射」もいい手だと思います。
16
+
17
+ これを水平方向だけでなく緯度・経度の2方向について応用すれば全方向に対応できるでしょう。
18
+
19
+ たとえばこんな感じに...
20
+
21
+ ```C#
22
+
23
+ using UnityEngine;
24
+
25
+
26
+
27
+ public class AllrangeCannon : MonoBehaviour
28
+
29
+ {
30
+
31
+ public float BulletSpeed = 10.0f;
32
+
33
+ public GameObject BulletPrefab;
34
+
35
+
36
+
37
+ public int HorizontalBulletCount = 12;
38
+
39
+ public float MuzzleOffset = 2.0f;
40
+
41
+
42
+
43
+ private void Shot()
44
+
45
+ {
46
+
47
+ var angleStep = 360.0f / this.HorizontalBulletCount;
48
+
49
+ this.ShotHorizontal(0.0f, this.HorizontalBulletCount); // 赤道方向に弾を発射
50
+
51
+ for (var angle = angleStep; angle < 90.0f; angle += angleStep)
52
+
53
+ {
54
+
55
+ this.ShotHorizontal(angle, this.HorizontalBulletCount); // 北緯angle°に弾を発射
56
+
57
+ this.ShotHorizontal(-angle, this.HorizontalBulletCount); // 南緯angle°に弾を発射
58
+
59
+ }
60
+
61
+ }
62
+
63
+
64
+
65
+ private void ShotHorizontal(float angleV, int maxCount)
66
+
67
+ {
68
+
69
+ angleV *= Mathf.Deg2Rad; // 緯度を弧度法による角度に変換
70
+
71
+ var cosAngleV = Mathf.Cos(angleV);
72
+
73
+ var sinAngleV = Mathf.Sin(angleV);
74
+
75
+ var count = (int)(cosAngleV * maxCount); // 緯度に合わせて弾数を減らす...緯線の長さは緯度のコサインに比例する
76
+
77
+ for (var i = 0; i < count; i++)
78
+
79
+ {
80
+
81
+ var angleH = (2.0f * Mathf.PI * i) / count; // 弧度法による経度
82
+
83
+ var cosAngleH = Mathf.Cos(angleH);
84
+
85
+ var sinAngleH = Mathf.Sin(angleH);
86
+
87
+
88
+
89
+ // 緯度、経度からVector3による方角を算出
90
+
91
+ var x = sinAngleH * cosAngleV;
92
+
93
+ var y = sinAngleV;
94
+
95
+ var z = cosAngleH * cosAngleV;
96
+
97
+ var direction = new Vector3(x, y, z); // この方角に弾を1発発射したい
98
+
99
+
100
+
101
+ // 以下、弾の発射方法についてはご質問者さんの設計に合わせて変えてみてください
102
+
103
+ var bullet = Instantiate(
104
+
105
+ this.BulletPrefab,
106
+
107
+ this.transform.position + (direction * this.MuzzleOffset),
108
+
109
+ Quaternion.LookRotation(direction));
110
+
111
+ var rigidbody = bullet.AddComponent<Rigidbody>();
112
+
113
+ rigidbody.useGravity = false;
114
+
115
+ rigidbody.constraints = RigidbodyConstraints.FreezeRotation;
116
+
117
+ rigidbody.AddForce(direction * this.BulletSpeed, ForceMode.VelocityChange);
118
+
119
+ }
120
+
121
+ }
122
+
123
+
124
+
125
+ private void Update()
126
+
127
+ {
128
+
129
+ if (Input.GetKeyDown(KeyCode.Space))
130
+
131
+ {
132
+
133
+ this.Shot();
134
+
135
+ }
136
+
137
+ }
138
+
139
+ }
140
+
141
+ ```
142
+
143
+
144
+
145
+ ![プレビュー](a6eca5546e0ace0e38bfe424b2fc3b65.gif)