同じアクションゲームでも、カメラの動き一つで「手触り」はまるで変わります。プレイヤーにピタッと張り付くだけのカメラは硬く、被弾しても画面はピクリともしない——それだけで、なんだか手応えのないゲームに見えてしまいます。
Camera2D は2Dゲームの「目」です。この記事では、没入感とフィードバックをぐっと引き上げる3つの定番テクニック——スムー ズフォロー、画面振動(スクリーンシェイク)、動的ズーム——を実装し、最後にそれらを1つのボス演出にまとめます。
この記事でわかること
lerpによる、フレームレートに左右されない スムーズフォロー- トラウマ値で強弱を付ける 画面振動(スクリーンシェイク)
Tweenで滑らかに寄る・引く 動的ズーム- 3つを組み合わせた ボス登場演出 の作り方
スムーズフォロー:やわらかく追いかける
ターゲットの座標をそのままカメラに代入すると、動きが硬く、物理で動くプレイヤーを追うと ジッター(カクつき) が出やすくなります。原因の多くは、物理更新(_physics_process)と描画(_process)のタイミングのズレです(詳しくは _processと_physics_processの使い分け)。

手軽に済ませるなら、Camera2Dの position_smoothing_enabled を true にして 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乗)にするのがコツで、小さな衝撃は控えめ、大きな衝撃は派手になります。白く光らせる ホワイトフラッシュ と重ねると、打撃感がさらに増します。
動的ズーム:寄る・引くで演出する
ズームは、ボス戦で寄る・広いエリアで引く、といった演出に効きます。ただし瞬間的に変えると酔うので、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でも、「ここぞ」の場面を盛り上げる型は同じです。
- ボスが現れたら、ズームインしてボスを大きく見せる(緊張感)
- 同時に軽くシェイク(地響き)
- 演出が終わったら、スムーズフォローで通常のバトルへ戻る

これまでの 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)は別々のプロパティを触るので、同時に効いても喧嘩しません。だから重ねるだけで演出がリッチになります。
よくある間違いとベストプラクティス

| よくある間違い | ベストプラクティス |
|---|---|
_process で物理オブジェクトを追い、ジッターが出る | 物理追従は _physics_process で。Camera2Dの Process Callback を Physics にするのが手軽 |
position と global_position を混同する | カメラは常に global_position を基準に計算する |
lerp のウェイトに delta を直接掛けてフレームレート依存になる | 1.0 - pow(smoothing, delta) の補正式を使う |
| ステージの外(背景の切れ目)まで映してしまう | Camera2Dの limit_left / limit_right など で移動範囲を制限する |
おまけ:先に知っておくと良いこと
- 複数ターゲットに合わせるズーム :協力プレイなどで全員を映したいときは、全ターゲットを囲む最小の矩形(
Rect2)を求め、それが収まるようにzoomを調整します。 - シェイクはシェーダーでも :
offsetを揺らす代わりに、画面全体をシェーダーで歪ませると、回転や色ズレなど凝った揺れも表現できます。 limitで見せたくない外を隠す :ステージの端でカメラが背景の外を映さないよう、limit_*を設定しておくと安心です。- 演出は Tween に任せる :ズームだけでなく、フェードや揺れの復帰も Tween でまとめると、コードがすっきりします。
まとめ
- スムーズフォロー :
lerp+1.0 - pow(smoothing, delta)で、なめらかでフレームレート非依存の追従 - 画面振動 :
traumaを衝撃で加算・時間で減衰し、trauma²に比例してoffsetを揺らす - 動的ズ ーム :
Tweenでzoomを滑らかに。値が大きいほど寄る - 組み合わせ :位置・
offset・zoomは別プロパティ。足し算で共存し、ボス演出のように重ねられる
まずはスムーズフォローだけ入れてみて、被弾に軽いシェイク、ボスにズーム、と一段ずつ足していきましょう。カメラが動き出すだけで、同じゲームが見違えるように「効く」ようになります。