はじめに
ゲーム画面が退屈に見えるのは、キャラクターが画面の中央に固定されているからかもしれません。プレイヤーの動きに合わせてカメラを動かし、世界を「眺める」ようにするのが Camera2D の役割です。この記事では、Camera2D を使ってゲーム世界を生き生きと映す方法を見ていきます。
Camera2D とは?
Camera2D は、2Dゲーム画面の「視点」を管理するノードです。キャラクターやプレイヤーが動くとき、カメラがそれに付いて行き、ゲーム世界全体を「見守る目」の役割をします。
映画のカメラマンが被写体を追いながら動くように、ゲームのカメラもプレイヤーキャラクターを追いながら画面を映し出す—それが Camera2D です。
Camera2D は Node2D を継承しており、他の2Dノードと同じく、位置・回転・スケールを持つことができます。ただし、他のノードと違い、「何かを描画する」のではなく、「何を描画するか」を決定する存在です。
このノードを使うべき場面
- プレイヤーキャラクターを追従する、横スクロールアクションゲーム
- マップ全体を見守る俯瞰視点のRPG
- ボス戦闘時に、ボスをズームして見せるカメラワーク
- パンニング(画面のスクロール)や揺れ(シェイク)の演出が必要なシーン
- マップの端まで来たときに、カメラが端で止まる処理(バウンダリ設定)
こういうときは他を検討: ゲーム画面全体を固定サイズで見たいだけなら、Camera2D を使わず、CanvasLayer で工夫することもできます。また、3Dゲームでは Camera3D を使うことになります。
主なプロパティと機能
Camera2D が持つ代表的なプロパティは、以下のようにまとめられます。
| プロパティ名 | 説明 | デフォルト値 |
|---|---|---|
enabled |
カメラが有効か無効か。false にするとカメラは動かない | true |
global_position |
カメラの位置(ゲーム世界座標系) | 依存 |
zoom |
ズームレベル。1.0 が等倍、2.0 で2倍に拡大 | 1.0 |
limit_left, limit_right, limit_top, limit_bottom |
カメラが移動できる範囲を制限(マップの端など) | -10000000 〜 10000000 |
drag_horizontal_enabled |
プレイヤーが画面中央から左右にずれたときのカメラの滑らかさ | true |
drag_vertical_enabled |
プレイヤーが画面中央から上下にずれたときのカメラの滑らかさ | true |
最も基本的な使い方は、スクリプトから Camera2D の position をプレイヤーの位置に設定すること。あるいは、プレイヤーノードを Camera2D の親にして、自動で追従するようにします。
# プレイヤーを追従する基本パターン
extends Node2D
@onready var camera = $Camera2D
@onready var player = $Player
func _process(delta):
# カメラをプレイヤーの位置に合わせる
camera.global_position = player.global_position
或いは、プレイヤーノードの子ノードとして Camera2D を配置すれば、自動で追従します。
# プレイヤーが子ノードを持つ場合、カメラは親の動きに自動で付く
# Player スクリプト内で Position2D を更新すれば、
# Camera2D はその変更を受け継ぐ
func _process(delta):
self.position += velocity * delta
もっと使いこなす:カスタマイズできるパラメータ
まずは基本を動かしてみてから、余裕が出たら試してみてください。
ズーム機能で画面サイズを動的に変える
zoom プロパティを時間とともに変えることで、画面を拡大・縮小できます。ボス戦闘の開幕で一度ズームインして、迫力を出すなど、演出として活用できます。
# ボス登場時にズームインする演出
@onready var camera = $Camera2D
func boss_appear():
var tween = create_tween()
tween.tween_property(camera, "zoom", Vector2(1.5, 1.5), 1.0)
# 1秒かけて 1.5 倍にズーム
カメラシェイク(揺れ)で緊迫感を演出
カメラの位置をランダムにずらすことで、爆発やダメージのシェイク効果が生まれます。
# カメラを揺らす
func shake_camera(duration: float, strength: float):
var original_offset = camera.offset
var elapsed = 0.0
while elapsed < duration:
camera.offset = original_offset + Vector2(
randf_range(-strength, strength),
randf_range(-strength, strength)
)
elapsed += get_process_delta_time()
await get_tree().process_frame
camera.offset = original_offset
マップの端でカメラを止める(リミット設定)
limit_left, limit_right, limit_top, limit_bottom を設定することで、カメラがマップの外に出ないようにできます。
| パラメータ | 説明 | 活用例 |
|---|---|---|
limit_left |
カメラが左に移動する最小位置 | マップの左端を 0 に設定 |
limit_right |
カメラが右に移動する最大位置 | マップの横幅が 1600 なら 1600 に設定 |
limit_top |
カメラが上に移動する最小位置 | マップの上端を 0 に設定 |
limit_bottom |
カメラが下に移動する最大位置 | マップの縦幅が 900 なら 900 に設定 |
# マップが 1600x900 の場合
@onready var camera = $Camera2D
func _ready():
camera.limit_left = 0
camera.limit_right = 1600
camera.limit_top = 0
camera.limit_bottom = 900
ドラッグスムース設定で追従のなめらかさを調整
drag_horizontal_enabled と drag_vertical_enabled を使って、カメラの反応速度を調整できます。有効にすると、カメラの動きが目標に向かってゆっくり滑るようになります。
# スムーズな追従を有効化
@onready var camera = $Camera2D
func _ready():
camera.drag_horizontal_enabled = true
camera.drag_vertical_enabled = true
# さらに細かく調整したい場合、drag_horizontal_speed などもある
複数の Camera2D を切り替える
ゲーム内に複数のカメラを作り、状況に応じて enabled を切り替えることで、カメラの視点を変えられます。
# ボス戦用カメラに切り替え
@onready var player_camera = $PlayerCamera
@onready var boss_camera = $BossCamera
func enter_boss_battle():
player_camera.enabled = false
boss_camera.enabled = true
まとめ
Camera2D は、ゲーム世界を「どう見せるか」を制御する目玉ノードです。プレイヤーの動きに追従させたり、ズームやシェイクで演出したり、マップの端で止ぁたりと、多くのゲーム要素を支えています。
- 基本は「position をプレイヤーに合わせる」だけで十分動く
- zoom、shake、limit などを組み合わせれば、ゲームの雰囲気が大きく変わる
- 複数のカメラを切り替えることで、シーンごとに視点を変えられる
次の記事では、ゲーム画面に UI を重ねるための CanvasLayer につうりc��で見ていきます。
シリーズ:Godot 4 ノード解説
- 001. ノード解説「Node」
- 002. ノード解説「Node2D」
- 003. ノード解説「Sprite2D」
- 004. ノード解説「CharacterBody2D」
- 005. ノード解説「Area2D」
- 006. ノード解説「CollisionShape2D」
- 007. ノード解説「AnimatedSprite2D」
- 008. ノード解説「Timer」
- 009. ノード解説「Camera2D」
- 010. ノード解説「CanvasLayer」
- 011. ノード解説「Control」
- 012. ノード解説「Label」
この記事は Godot 4.x をもとに執筆しています。



コメント