近接攻撃
この記事は Godot 3から Godot 4 へ内容の書き換え中です。 Godot4では存在しない変数、関数が含まれている場合があります。もしその場合はリポジトリのIssuesまでご報告ください。
課題
剣やパンチなどの近接攻撃を実装したい。
解決策
本例では、既に攻撃アニメーションが設定されたキャラクターが存在すると仮定します。説明のために、以下の2種類の攻撃を使用します。
Area2D を使用して剣がターゲットに命中したことを検出できますが、実際に有効化する必要があるのはスイング動作中のみです。アニメーションと同期させるためには、この活性化をAnimationPlayerで制御します。
シーンに Area2D と CollisionShape2D を追加してください。ヒットボックスには矩形形状を使用し、剣が振り上げフレームで完全にカバーされるようにサイズを調整します。
アニメーションを最初のフレームに移動し、領域の [無効] プロパティを確認します。キーフレームアイコンをクリックしてアニメーションにトラックを追加してください。次に、剣が伸びているフレームまでアニメーションを進め、[無効] を解除した状態でもう1つのキーフレームを追加してください。最後に、スイングの終わりまで進み、再度 [無効] を有効にしてキーフレームを作成します。
新しいエリアのarea_enteredシグナル(またはゲームの設定によっては、body_entered)を接続します。このデモでは、ダメージを受け取れる任意のボディにはArea2Dが定義され、「hurtbox」というグループ内に配置されているとします。
func _on_SwordHit_area_entered(area):
if area.is_in_group("hurtbox"):
area.take_damage()
これで実際に試してみて、ターゲットが剣の当たり判定範囲内にいればダメージが発生するか確認できるはずです。
ヒットボックスサイズの変更方法
複数の攻撃アニメーションがある場合、ダメージ範囲の大きさが統一されていないことがあります。上記のアニメーション例では、最初の動きは広範囲をカバーする斜め上方向への振り下ろし攻撃です。この処理に対応するため、衝突形状の Extents プロパティに対するアニメーショントラックも追加が必要です。この値を設定して各アニメーションの開始時にキーフレームとして登録してください。