マニュアル: 弾幕(BarrageBullet)システム

概要

弾幕システムとは、専用の実行アクション「弾幕を発射(FireBarrageBullet)」を使い、最低限の機能だけを持った非常に軽量な弾を発射するシステムです。
数百個単位の弾を発射することができますが機能は非常に限定されており、弾にヴィジュアルスクリプトを設定したり、弾をアニメーションさせたりといったことはできません。
弾幕との接触についても、専用の条件「弾幕と接触(CollideWithBarrageBullet)」を通してのみ検知することができます。従来の攻撃判定との接触や壁判定との接触では検知することができません。
複雑な動きをする弾については、従来の「弾を発射」アクションをご利用ください。

「弾幕を発射」でできること

  • 発射タイプを全方位、連射、ショットガンから選択できます。
  • 発射地点を指定することができます。
  • 発射のターゲットを指定することができます。
  • 発射後の動きを直進、カーブ、方向転換、分裂、ホーミングから選ぶことができます。
  • 弾のスプライトを指定することができます。
  • 弾は0度(右側)を正面として移動方向に応じて自動で回転します。
  • 弾の速度を指定することができます。発射後の加減速も可能です。
  • 判定サイズやコリジョンレイヤーを指定することができます。
  • 弾の攻撃力や属性を指定することができます(ただし、ダメージ処理は自動では行われないため、手動で設定する必要があります。)

「弾幕パターン」の生成例

「花模様」

「全方位」+「カーブ弾」を複数同時に生成します。その際、カーブ角度を1つは0.3度、1つはマイナス0.3度など逆になるようにするときれいな模様が描けます。
回転を加えると洗濯機になります。

「格子模様」

「連射」+「直進」弾を複数、発射地点のオフセットをずらして設定しましょう。方向転換や分裂を加えても面白いかもしれません。

「自機狙い」

ターゲットでプレイヤーを狙うように設定しましょう、その際オフセットを設定すると自機外し弾になり、ホーミングを設定すると先読み弾風になります。

「弾幕」とスクリプト

弾幕システムで生成される弾にはスクリプトを設定できません。
そのため、「弾幕と接触」を使うことで、「接触した側のオブジェクト」のスクリプトで様々な動作を実現することになります。

「弾幕と接触」でできること

  • オブジェクトの「HitArea」と弾幕の判定の接触を検知することができます。「HitArea2D」のレイヤーマスクと、「弾幕」のレイヤーが一致すると検知できます。
  • 接触した弾幕を消すことができます。ボムや被弾で利用できます。
  • 弾幕を消した際、消した弾を確率を指定して別のオブジェクトやGodotシーンに変化させることができます。主にボムで利用できます。
  • 接触した弾幕の攻撃力や属性を指定の変数として格納することができます。

「弾幕と接触」を使った実用例

「ボム」

ボムの攻撃判定に等しく、弾幕のレイヤーに合わせたレイヤーマスクを設定した「HitArea」を持つゲームオブジェクトを作りましょう。(*少しヤヤコシイですが、接触検知はAttackAreaではできないためです。)
炸裂タイミングで「HitArea」が有効になり消えるようなヴィジュアルスクリプトを組みます、炸裂後、接触した弾幕を消すオプションを有効にした「弾幕と接触」条件を設定しましょう。
・ボムで弾幕を削除するとスコアアイテムが出るような処理を行う場合
ドロップアイテムを指定しましょう、この際の変換処理は通常のゲームオブジェクト生成処理と同等の負荷がかかるため、沢山同時に出現させると処理落ちが発生しやすくなります。ドロップ率は10%等低めに設定することをおすすめします。
・ボムで敵にもダメージを与えたい場合
通常のダメージ処理を同時に行うだけです、「AttackArea2D」や攻撃力を設定しましょう。

「かすり」

「かすり」処理を行うための専用のゲームオブジェクトを作成し、子ノードとしましょう。
・かすり用オブジェクトの設定
親オブジェクトより大きなHitAreaを設定します。
ヴィジュアルスクリプトで、「弾幕と接触」時にかすり用アニメーションやパーティクルを出す、スコアを加算するといった処理を設定しましょう。

「弾幕のダメージ/属性処理」

通常のダメージシステムを利用できないため手動で設定する必要があります。
「変数Aに弾幕のダメージ」「変数Bに弾幕の属性」を保存します。
・単純にダメージを与える場合
ダメージ処理ステートでは、「HPを変数Aの値分減らす」処理を設定します。
・属性によって変化を与える場合
遷移リンクの条件に、「変数Bが指定の値の場合」を設定して分岐させます。

GDScriptによる弾幕の生成

弾の動きや動作を設定するクラスを弾幕マネージャの API に渡す事で弾幕を発生させることができます。
例:発射後5秒後に消滅する弾を36度毎に全方位に発射する弾幕

# 弾のコマンドリスト作成(5秒後に消滅)
var vanish_command = BarrageBulletVanishCommand.new()
var wait_command = BarrageBulletWaitCommand.new()
wait_command.wait_time = 5

# 弾のアクションデータにコマンドリストを設定
var bullet_action_data = BarrageActionData.new()
bullet_action_data.command_list = [wait_command, vanish_command]

# 弾データ作成
var bullet_data = BarrageBulletData.new()
bullet_data.action_list = [bullet_action_data]
bullet_data.image_path = "res://〇〇.png"
bullet_data.speed = 100

# 全方位に発射する弾幕データを作成
# 発射コマンド
var fire_command = BarrageBulletFireCommand.new()
fire_command.bullet_data = bullet_data
# 方向データ
var direction_data = BarrageBulletDirectionData.new()
direction_data.direction_type = 3 # 一つ前に発射された角度を参照するようにする(BulletMLにおけるSEQUENCE)
direction_data.angle = 36   # 弾同士の間隔
# 発射コマンドに設定
fire_command.fire_direction_data = direction_data
# リピートコマンドに渡すアクションデータ作成
var repeat_command_action = BarrageActionData.new()
repeat_command_action.command_list = [fire_command]
# 10回繰り返すリピートコマンド作成
var repeat_command = BarrageBulletRepeatCommand.new()
repeat_command.action_data = repeat_command_action
repeat_command.repeat_num = 10

# 弾幕発射コマンドリスト作成
var barrage_command_list = [repeat_command]
# マネージャーに渡すアクションデータ
var action_data = BarrageActionData.new()
action_data.command_list = barrage_command_list

# 弾幕マネージャーに渡す
BarragesManager.fire_barrage([action_data])