【Godot】Godot Engine Camera2D 実践テクニック集:スムーズ追従、画面振動、動的ズームを極める

作成: 2025-12-08最終更新: 2026-07-08

GodotのCamera2Dを使いこなす実践テクニック。lerpによるスムーズフォロー、トラウマ値の画面振動、Tweenの動的ズーム、そして3つを組み合わせたボス演出まで解説します。

同じアクションゲームでも、カメラの動き一つで「手触り」はまるで変わります。プレイヤーにピタッと張り付くだけのカメラは硬く、被弾しても画面はピクリともしない——それだけで、なんだか手応えのないゲームに見えてしまいます。

Camera2D は2Dゲームの「目」です。この記事では、没入感とフィードバックをぐっと引き上げる3つの定番テクニック——スムーズフォロー画面振動(スクリーンシェイク)動的ズーム——を実装し、最後にそれらを1つのボス演出にまとめます。

2Dゲームのカメラのイメージ。ビューポートの枠の中にプラットフォーム上のキャラクターが映り、カメラが動いていることを示す動き線が添えられている

この記事でわかること

  • lerp による、フレームレートに左右されない スムーズフォロー
  • トラウマ値で強弱を付ける 画面振動(スクリーンシェイク)
  • Tween で滑らかに寄る・引く 動的ズーム
  • 3つを組み合わせた ボス登場演出 の作り方

Sponsored

スムーズフォロー:やわらかく追いかける

ターゲットの座標をそのままカメラに代入すると、動きが硬く、物理で動くプレイヤーを追うと ジッター(カクつき) が出やすくなります。原因の多くは、物理更新(_physics_process)と描画(_process)のタイミングのズレです(詳しくは _processと_physics_processの使い分け)。

カメラの追従。即座に代入するとカクつくが、lerpで補間するとプレイヤーの少し後ろをなめらかに追いかける

手軽に済ませるなら、Camera2Dの position_smoothing_enabledtrue にして position_smoothing_speed を調整するだけでも滑らかになります。もっと細かく制御したいなら、lerp(線形補間)で自分で追従させます。

extends Camera2D

@export var target: Node2D
@export_range(0.0, 1.0) var smoothing := 0.05   # 小さいほど、ゆっくり滑らかに追う

func _physics_process(delta: float) -> void:
    if not is_instance_valid(target):
        return
    # フレームレートが変わっても追従速度が一定になる補間
    global_position = global_position.lerp(target.global_position, 1.0 - pow(smoothing, delta))

ポイントは、lerp のウェイトに 1.0 - pow(smoothing, delta) を使うこと。これで フレームレートが変動しても追従速度がほぼ一定 に保たれます。物理で動くプレイヤーを追うので、処理は _physics_process に置きます。

画面振動:衝撃を伝える

被ダメージ・強い攻撃・爆発——「衝撃」を画面全体を揺らして伝えるのがスクリーンシェイクです。おすすめは トラウマ(trauma)値 を使う方法。衝撃で加算し、時間で減衰させ、その大きさに応じて揺らします。

トラウマ値による画面振動。衝撃で加算され時間で減衰するトラウマ値に比例して、カメラの揺れが大きく→小さくなる
extends Camera2D

var trauma := 0.0
@export var trauma_decay := 0.8   # 毎秒の減衰
@export var max_offset := 12.0    # 最大の揺れ幅

func add_trauma(amount: float) -> void:
    trauma = minf(trauma + amount, 1.0)   # 衝撃で加算(1.0で頭打ち)

func _process(delta: float) -> void:
    if trauma <= 0.0:
        offset = Vector2.ZERO
        return
    trauma = maxf(trauma - trauma_decay * delta, 0.0)   # 時間で減衰
    var shake := trauma * trauma                          # 2乗で、強い揺れが際立つ
    offset = Vector2(randf_range(-1, 1), randf_range(-1, 1)) * max_offset * shake

爆発なら add_trauma(0.8)、小さな被弾なら add_trauma(0.2) のように 強弱を呼び分ける と、フィードバックが一気に豊かになります。揺れを trauma(一次)ではなく trauma * trauma(2乗)にするのがコツで、小さな衝撃は控えめ、大きな衝撃は派手になります。白く光らせる ホワイトフラッシュ と重ねると、打撃感がさらに増します。

Sponsored

動的ズーム:寄る・引くで演出する

ズームは、ボス戦で寄る・広いエリアで引く、といった演出に効きます。ただし瞬間的に変えると酔うので、Tween で滑らかに変化させます。

動的ズーム。ズームアウトで広く見せ、ズームインで対象に寄る。切り替えはTweenで滑らかに行う
extends Camera2D

func animate_zoom(target_zoom: float, duration := 0.5) -> void:
    var tween := create_tween().set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_OUT)
    # zoomはVector2。両軸を同じ値で動かす。値が大きいほど「寄る」
    tween.tween_property(self, "zoom", Vector2(target_zoom, target_zoom), duration)

func _unhandled_input(event: InputEvent) -> void:
    if event.is_action_pressed("zoom_in"):
        animate_zoom(1.5)   # 1.5倍に寄る
    elif event.is_action_pressed("zoom_out"):
        animate_zoom(1.0)   # 元に戻す

Godot 4の Camera2D.zoom値が大きいほど拡大(寄る) です。Vector2(2, 2) なら2倍に寄った状態になります。

実践:ボス登場の演出を組む

3つのテクニックを、 ボス登場の一連の演出 にまとめてみます。アクションでもSTGでもARPGでも、「ここぞ」の場面を盛り上げる型は同じです。

  1. ボスが現れたら、ズームインしてボスを大きく見せる(緊張感)
  2. 同時に軽くシェイク(地響き)
  3. 演出が終わったら、スムーズフォローで通常のバトルへ戻る
ボス登場演出の流れ。ズームイン+シェイクでボスを見せ、通常ズームへ戻し、スムーズフォローに戻る。位置・揺れ・ズームは足し算で共存する

これまでの Camera2D スクリプト(フォロー・シェイク・ズームの機能を持つもの)に、まとめ役の関数を足すだけです。

func play_boss_intro(boss: Node2D) -> void:
    set_physics_process(false)               # 演出中は通常追従を止める
    global_position = boss.global_position   # ボスへ寄る
    animate_zoom(1.6, 0.6)                    # ぐっとズームイン
    add_trauma(0.5)                          # 地響きのシェイク
    await get_tree().create_timer(1.5).timeout
    animate_zoom(1.0, 0.5)                    # 通常ズームへ
    set_physics_process(true)                # スムーズフォロー再開

ポイントは2つです。

  • 演出中は通常追従を止めるset_physics_process(false)_physics_process の追従を一時停止し、カメラを演出用に手動で動かします。終わったら true に戻すだけ。役割の切り替えが1行で済みます。
  • 3つは足し算で共存する :フォロー(global_position)・シェイク(offset)・ズーム(zoom)は別々のプロパティを触るので、同時に効いても喧嘩しません。だから重ねるだけで演出がリッチになります。
Sponsored

よくある間違いとベストプラクティス

Camera2Dのlimitで移動範囲を制限し、カメラがステージの外(背景の切れ目)を映さないようにする図
よくある間違いベストプラクティス
_process で物理オブジェクトを追い、ジッターが出る物理追従は _physics_process で。Camera2Dの Process CallbackPhysics にするのが手軽
positionglobal_position を混同するカメラは常に global_position を基準に計算する
lerp のウェイトに delta を直接掛けてフレームレート依存になる1.0 - pow(smoothing, delta) の補正式を使う
ステージの外(背景の切れ目)まで映してしまうCamera2Dの limit_left / limit_right など で移動範囲を制限する

おまけ:先に知っておくと良いこと

  • 複数ターゲットに合わせるズーム :協力プレイなどで全員を映したいときは、全ターゲットを囲む最小の矩形(Rect2)を求め、それが収まるように zoom を調整します。
  • シェイクはシェーダーでもoffset を揺らす代わりに、画面全体をシェーダーで歪ませると、回転や色ズレなど凝った揺れも表現できます。
  • limit で見せたくない外を隠す :ステージの端でカメラが背景の外を映さないよう、limit_* を設定しておくと安心です。
  • 演出は Tween に任せる :ズームだけでなく、フェードや揺れの復帰も Tween でまとめると、コードがすっきりします。

まとめ

  • スムーズフォローlerp1.0 - pow(smoothing, delta) で、なめらかでフレームレート非依存の追従
  • 画面振動trauma を衝撃で加算・時間で減衰し、trauma² に比例して offset を揺らす
  • 動的ズームTweenzoom を滑らかに。値が大きいほど寄る
  • 組み合わせ :位置・offsetzoom は別プロパティ。足し算で共存し、ボス演出のように重ねられる

まずはスムーズフォローだけ入れてみて、被弾に軽いシェイク、ボスにズーム、と一段ずつ足していきましょう。カメラが動き出すだけで、同じゲームが見違えるように「効く」ようになります。