#はじめに
n-way弾とはシューティングでよくある扇状に弾が出るショットのことです。
はじめてUnityをさわりシューティングゲームを作ってたころ、3way弾の作成においてプレイヤーに弾を出す子オブジェクトを3つ付け、それぞれの角度を3方向に向けることで3way弾にするというかなりのごり押しなことをやってました。
ので今回はちゃんとfor文つかってのn-way弾作成です。前回の斜方投射のとこからコードを流用してるところが多いです。
#変数の説明
いろいろ試せるようpublicな変数でパラメータを調整できるようにしたのですが、ぱっとみじゃよくわからない感じになったので事前説明をしておきます。
Degree
:扇状に出る弾の端から端までの角度
Angle_Split
:角度の分割数。Degreeで決めた角度の範囲内に入る弾の数
相変わらずにイラストですみません。絵的にはこんな感じになります。
インスペクター上
上二つは前回でも使ってた弾オジェクト入れと初速度の設定です。見てほしいのは下二つで、この場合だと45度の範囲に6way弾を出す設定になります。
#ソースコードと実行結果
public GameObject Bullet;
public float _Velocity_0, Degree, Angle_Split;
float _theta;
float PI = Mathf.PI;
void Update(){
//ランチャーの移動================================
Vector2 pos = transform.position;
pos.x += 0.1f * Input.GetAxisRaw("Horizontal");
transform.position = pos;
//================================================
//スペースキーで弾発射
if (Input.GetKeyDown(KeyCode.Space)) {
for (int i = 0; i <= (Angle_Split - 1); i++) {
//n-way弾の端から端までの角度
float AngleRange = PI * (Degree / 180);
//弾インスタンスに渡す角度の計算
if (Angle_Split > 1) _theta = (AngleRange / (Angle_Split - 1)) * i + 0.5f * (PI - AngleRange);
else _theta = 0.5f * PI;
//弾インスタンスを取得し、初速と発射角度を与える
GameObject Bullet_obj = (GameObject)Instantiate(Bullet, transform.position, transform.rotation);
BulletSc bullet_cs = Bullet_obj.GetComponent<BulletSc>();
bullet_cs.theta = _theta;
bullet_cs.Velocity_0 = _Velocity_0;
}
}
}
public float Velocity_0, theta;
Rigidbody2D rid2d;
void Start() {
//Rigidbody取得
rid2d = GetComponent<Rigidbody2D>();
//角度を考慮して弾の速度計算
Vector2 bulletV = rid2d.velocity;
bulletV.x = Velocity_0 * Mathf.Cos(theta);
bulletV.y = Velocity_0 * Mathf.Sin(theta);
rid2d.velocity = bulletV;
}
BulletSc.csは前回のと変わってないです。
あと、一応n-way弾として作ってるためあまり意味はないですが、Angle_Splitが1だった場合0割が発生してエラーがでるため、_thetaの下に対応の処理を入れてます。
45度で6-way弾
90度で4-way弾
180度で18-way弾
Degreeを360にすれば全方位弾も放てます
360度で18-way弾
#最後
今回は上から敵が降ってくる体での設計なので、コードの中にいくつかマジックナンバー的なのがまぎれてしまってます。横シューに対応するにはいくつか角度の取り方を変える必要が在ります。
後いまさらながら変数名はAngle_Splitとかへんな名前にせず、普通にn_wayとかにしておけばよかったと思ってます。
//弾インスタンスに渡す角度の計算
if (Angle_Split > 1) _theta = (AngleRange / (Angle_Split - 1)) * i - 0.5f * AngleRange;
else _theta = 0;