マニュアル:バリアブルルシステム

概要

バリアージシステムは、専用の実行アクション「バリアージ弾を発射(FireBarrageBullet)」を使用して、最小限の機能しか持たない極めて軽量な弾を発射するシステムです。

一度に数百発の弾を発射できますが、機能は非常に限定されています。弾自体にビジュアルスクリプトを割り当てたり、アニメーションを適用したりすることはできません。

バリアージ弾との接触は、専用の条件「バリアージ弾と衝突(CollideWithBarrageBullet)」を通じてしか検出できません。通常の攻撃衝突検出や壁衝突検出では検出できません。

複雑な挙動を必要とする弾については、代わりに通常の「弾を発射(Fire Bullet)」アクションを使用してください。

「バリアージ弾を発射」でできること

  • 発射タイプを全方向連射ショットガンから選択。
  • 発射原点を指定。
  • 発射対象を指定。
  • 発射後の挙動を直進曲線方向転換分裂ホーミングから選択。
  • 弾のスプライトを指定。
  • 弾は移動方向に基づいて自動的に回転し、**0度(右方向)**を前方として扱う。
  • 弾の速度(発射後の加速・減速を含む)を指定。
  • ヒットボックスのサイズと衝突レイヤーを指定。
  • 弾の攻撃力と属性を指定(ただし、ダメージ処理は自動で行われず、手動で設定する必要があります)。

「バリアージパターン」の作成例

「花のパターン」

全方向曲線弾を使用して複数の弾を同時に生成。
反対方向の曲線角度(例:+0.3度と**-0.3度**)を設定することで、きれいな花のようなパターンを作成できます。
回転を加えると、洗濯機のようなパターンになります。

「グリッドパターン」

複数の連射直進弾を使用し、発射原点のオフセットをずらす。
方向転換や分裂を追加すると、興味深いバリエーションが生まれます。

「プレイヤー照準」

プレイヤーを対象に設定。
オフセットを加えることで、意図的にプレイヤーを外れる弾(「狙い外し弾」)を作成でき、ホーミング挙動を追加すると予測的な「先読み弾」になります。

バリアージとスクリプティング

バリアージシステムで生成された弾には、スクリプトを付与できません。

代わりに、すべての挙動は、衝突を検出するオブジェクトのスクリプト内に、「バリアージ弾と衝突」条件を使用して実装します。

「バリアージ弾と衝突」でできること

  • オブジェクトのHitAreaとバリアージ弾のヒットボックスとの接触を検出。
    検出は、HitArea2Dレイヤーマスクバリアージ弾のレイヤーと一致した場合に発生します。
  • 接触時にバリアージ弾を削除(爆弾やプレイヤーダメージに有用)。
  • バリアージ弾が削除された際、指定された確率に基づいて別のオブジェクトやGodotシーンに変換可能(主に爆弾で使用)。
  • 接触したバリアージ弾の攻撃力属性を指定された変数に格納。

「バリアージ弾と衝突」の実用例

「爆弾」

バリアージ弾レイヤーと一致するHitAreaを持つゲームオブジェクトを作成し、爆弾の攻撃範囲とします。
(※少し複雑ですが、AttackAreaでは接触検出できません。)

ビジュアルスクリプトを使用して、HitAreaは爆発タイミングのみ有効になり、その後消滅するように設定。
爆発後、接触したバリアージ弾を削除するオプションを有効にした「バリアージ弾と衝突」条件を設定。

  • 爆弾でバリアージ弾を削除し、スコアアイテムを生成する場合
    ドロップアイテムを指定。この変換プロセスは通常のゲームオブジェクト生成と同等の処理コストを伴うため、一度に多数のアイテムを生成するとパフォーマンスが低下しやすくなります。ドロップ率は**10%**程度と低めに設定することを推奨します。
  • 爆弾で敵にもダメージを与える場合
    通常通りAttackArea2Dと攻撃力を設定し、同時に標準のダメージ処理を適用します。

「グレイジング」

グレイジングを処理する専用のゲームオブジェクトを作成し、子ノードにします。

  • グレイジングオブジェクトの設定
    親オブジェクトより大きなHitAreaを設定。
    ビジュアルスクリプトを使用して、「バリアージ弾と衝突」がトリガーされた際に、グレイジングアニメーションやパーティクルを再生し、スコアを増加させるなどの挙動を設定します。

「バリアージダメージ/属性処理」

標準のダメージシステムは使用できないため、ダメージ処理は手動で設定する必要があります。

格納:

  • バリアージダメージ変数A
  • バリアージ属性変数B
  • 単純なダメージ適用
    ダメージ処理ステートで、「変数Aの値だけHPを減少させる」などのロジックを設定。
  • 属性ベースの効果適用
    変数Bが指定値と等しい場合」などの遷移リンク条件を使用して、挙動を分岐させます。

GDScript を使用した弾幕の生成

弾幕マネージャAPI に、弾の移動と動作を定義するクラスを渡すことで、弾幕を生成できます。

例:
36度間隔 で全方向に弾を発射し、各弾は発射後 5秒で消える 弾幕。

# 弾のコマンドリストを作成(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])