Warning: The magic method InvisibleReCaptcha\MchLib\Plugin\MchBasePublicPlugin::__wakeup() must have public visibility in /home/c3453930/public_html/piyo-hobby.com/wp-content/plugins/invisible-recaptcha/includes/plugin/MchBasePublicPlugin.php on line 37
Godot入門:Camera2Dの使い方と活用法 | 日本語で学ぶGodot

Godot入門:Camera2Dの使い方と活用法

Node解説

はじめに

ゲーム画面が退屈に見えるのは、キャラクターが画面の中央に固定されているからかもしれません。プレイヤーの動きに合わせてカメラを動かし、世界を「眺める」ようにするのが 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 カメラが移動できる範囲を制限(マップの端など) -1000000010000000
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 をもとに執筆しています。

コメント