弾幕シューティングの弾の実装例
どなたかの参考になればと。
私が今使用している弾幕シューティングの弾の実装例を書いてみます。
前提はUnity + C#ですが、仕様なので環境や言語はなんでもよいでしょう。(コルーチンとか少々書いちゃってますが)
こちらのゲームで使用しているものです。
一部はこんな動画です
この仕様の良し悪しはは全く分かりません。参考資料を見つけられずに仕様を決め、レビューしてくれる相手もおらずに一人でやっちゃってますので。
一番上層の関数の仕様
// ##########################################
// N Way弾関数
// [引数]
// int flame この関数実行時から何フレーム遅らせて撃つか
// int bulletType 弾の形
// int bulletColor 弾の色
// int bulletOrderInLayer 弾の表示順(大きい方が手前)
// Vector3 Scale 弾の拡大率
// float power 弾の強さ
// GameObject? shotFromObj 弾の射出元
// Vector3 shotFromPosDeviation 弾の射出元からの偏差。射出元オブジェクトがnullの場合はワールド座標
// float shotRotation 弾の射出角度(これに数値があった場合、以降の射出先は無視する)
// GameObject? shotToObj 弾の射出対象オブジェクト
// Vector3 shotToPosDeviation 弾の射出対象からの位置偏差。射出対象オブジェクトがnullの場合は画面内絶対位置
// float shotToRotDeviation 弾の射出対象からの角度偏差(オイラー角)
// int stopFlame 弾生成直後の停止フレーム
// int reachThisSpeedInThisFrame 最終速度までに費やすフレーム
// float speed 弾のスピード(最終的な速度)
// int way wayの数
// float wayAngle wayの広さ(オイラー角)
// int repeat連射数
// int repeatDelay連射時の間隔(フレーム)
// ##########################################
(コードそのままだと恥ずかしくて出せないので手書きで体裁を整えてる部分があります)
説明
今はあらゆる弾をこの関数で撃ってます。
基本的にはN way弾の、自機狙い・固定角度指定です。それに射出位置の偏差・射出先の偏差を加えてます。
全部Way弾です。例えば単発の弾は1wayです。
弾は直進のみ。途中の方向転換や誘導等はなしでいます。
弾生成時の一時停止、加速して移動があります。
第一引数のflameで実際に弾が出るまでの遅延フレーム数を指定します。コルーチンでUpdate()のflame数遅延させます。
遅延フレームを指定できるので、弾幕の記述部分のコードが少なめになると思います。
「nullだったら」との条件分岐がある仕様はダサいと思うのですが、この関数のみで全部済ませるとの意図でこうしてます。実装者も私だけですので。
これの先の処理
弾の処理に階層を作ってます。上が敵寄り・攻撃のアルゴリズム寄り、下ほど低層のGameObject寄りです。
上記の関数
↓
flame数遅延させる
↓
Wayの奇数偶数判定
↓ ↓
奇数Way 偶数Way
↓ ↓
最後に個々の弾のObjectの処理
改修案
- 最終速度だけでなく、初速と最終速度をパラメータに持てば東方シリーズででよくやってる減速ができるはず
- SpliteRendereのCollorまで渡すときれいな弾幕を作れそう
- Way弾の上下が意図通りにできてない
他にも色々・・・
どのコンポーネントにもどんな値でも渡せちゃうのでなんでもできちゃうわけですが、手間がやってられなくなるので、何に絞るかは大事ですよねぇ。
リクルート
2018/11/21記述
共同作業者募集中です。報酬お出しします。副業ですね。
今、協力頂きたいのはプログラムできる方、デザインできる方だよなぁと思ってますが、まー、とりあえずゲームを作ってる人同士でお話ししましょうよ。
連絡先:こちらに連絡頂けますか?@nekopi