はじめに
2Dゲームにおいて、ライティングはしばしば見落とされがちです。しかし、適切な光源表現は、ゲーム画面に立体感、雰囲気、そして没入感をもたらします。PointLight2Dは、点光源(懐中電灯やろうそくのような)を簡単に実装でき、リアルな陰影を自動で計算してくれるノードです。ホラーゲーム、ダンジョン探索、夜間ステージなど、照明が重要な場面で威力を発揮します。
このノードを理解すれば、グラフィック設定を少し工夫するだけで、ゲームの見栄えが劇的に向上し、プレイヤーの没入感も大幅に改善されます。本記事では、基本的なライティングから、複雑な演出まで、段階的に解説していきます。
PointLight2Dとは?
PointLight2Dは、指定位置から360度に光を放つ点光源です。Godot 4 では「2D Lights」という機能がプロジェクト設定で有効になっていることが前提となります。物理ベースのシェーディングにより、リアルな光と影を自動計算でき、光の色、強度、範囲などを細かく制御できます。
「PointLight2D は暗い部屋に置いたろうそくのようなものです。周囲を照らし、影を落とす点光源です。リアルなライティングは複雑に見えますが、Godot が物理計算を肩代わりしてくれるため、見た目を微調整するだけで、プロフェッショナルな照明効果を実現できます。」
継承ツリー:
PointLight2D ↓ Light2D ↓ Node2D ↓ CanvasItem ↓ Node

このノードを使うべき場面
PointLight2Dは以下のような場面での使用に最適です:
- たいまつ・ランタンの炎 – 静的な街灯から動的なたいまつまで。キャラクターが持つ光源として、移動に伴い照明が動く効果。
- 爆発のフラッシュエフェクト – ボスの攻撃時に白い光が画面全体を覆う。一時的な PointLight2D で演出力を大幅アップ。
- キャラクターのオーラ発光 – 魔法少女の発光、敵の邪悪なオーラ。キャラの個性を視覚的に強調。
- 暗い洞窟での視界範囲表現 – 懐中電灯の光が届く範囲だけを見せ、外は漆黒。視界制限でゲーム性と雰囲気を両立。
別のノードが適切な場面:全体的に明るい昼間シーンでは、PointLight2Dは不要か、最小限に抑えるべきです。また、パフォーマンスが重視される場面(モバイルゲーム)では、ライティング計算を簡略化するか、事前にベイクされたライティングを使用する戦略も検討が必要です。
主なプロパティと機能
| プロパティ/メソッド | 型 | 説明 |
|---|---|---|
texture |
Texture2D | 光源の形状を定義するテクスチャ。グラデーション画像を使うと自然な光の落ちが表現できる |
texture_scale |
float | テクスチャのスケール。1.0 が標準。値を大きくすると光の範囲が拡大 |
color |
Color | 光の色。赤、青、緑など。ろうそく=黄色、電球=白色など、光源の種類で変更 |
energy |
float | 光の強度。0.0 ~無制限。1.0 が標準。大きいほど明るく、広く光が届く |
shadow_enabled |
bool | 影の計算を有効化。true で物理ベースの影が落ちるが、CPU 負荷が増加 |
shadow_color |
Color | 影の色。黒以外の色を使うと、色付きの影(例:青紫)で演出的な効果 |
blend_mode |
enum | 合成モード。ADD = 加算合成(明るくなる)、SUB = 減算合成(暗くなる)、MIX = 通常合成 |
range_z_min / range_z_max |
int | 光が影響する Z 値の範囲。複数レイヤーがある場合に、選択的に照明可能 |
重要な事前設定:PointLight2D を機能させるには、Project Settings → Rendering → Textures → Canvas Textures → Hdri の 「Use 2D Lights」を ON にする必要があります。
コード例1:基本的なPointLight2Dの動的制御
extends PointLight2D
@export var base_color: Color = Color.YELLOW
@export var flicker_speed: float = 2.0
@export var flicker_strength: float = 0.3
@export var movement_speed: float = 50.0
var base_energy: float = 1.0
var elapsed_time: float = 0.0
func _ready():
# 初期設定
base_energy = energy
color = base_color
shadow_enabled = true
func _process(delta):
elapsed_time += delta
# ろうそくのゆらぎ効果
var flicker = sin(elapsed_time * flicker_speed) * flicker_strength
energy = base_energy + flicker
# マウスに追従する光源
global_position = get_global_mouse_position()
func set_light_intensity(new_energy: float):
"""光の強度を変更(フェードイン・フェードアウト)"""
var tween = create_tween()
tween.set_trans(Tween.TRANS_QUAD)
tween.set_ease(Tween.EASE_OUT)
tween.tween_property(self, "energy", new_energy, 0.5)
func set_light_color(new_color: Color):
"""光の色を変更"""
var tween = create_tween()
tween.set_trans(Tween.TRANS_QUAD)
tween.set_ease(Tween.EASE_IN_OUT)
tween.tween_property(self, "color", new_color, 0.3)
func flash(flash_strength: float = 2.0, duration: float = 0.2):
"""爆発やフラッシュのような一時的な光の増加"""
var original_energy = energy
energy = flash_strength
var tween = create_tween()
tween.set_trans(Tween.TRANS_QUAD)
tween.set_ease(Tween.EASE_OUT)
tween.tween_property(self, "energy", original_energy, duration)
コード例2:複数の光源を管理するシステム
extends Node2D
class_name LightingSystem
@export var ambient_darkness: float = 0.3 # 環境光の暗さ(0.0 = 完全暗黒、1.0 = 完全明るい)
@export var day_night_cycle_duration: float = 60.0 # 1日の長さ(秒)
var time_of_day: float = 0.0
var lights: Array[PointLight2D] = []
@onready var canvas_modulate = CanvasModulate.new()
func _ready():
# 全 PointLight2D ノードを収集
var light_nodes = get_tree().get_nodes_in_group("lights")
for light_node in light_nodes:
if light_node is PointLight2D:
lights.append(light_node)
# 環境光を制御(全体の明るさ)
add_child(canvas_modulate)
canvas_modulate.color = Color.WHITE
func _process(delta):
time_of_day += delta
if time_of_day > day_night_cycle_duration:
time_of_day = 0.0
# 昼夜サイクルに応じて環境光を変更
update_ambient_light()
func update_ambient_light():
"""昼夜サイクルに応じて環境光と各光源の見た目を更新"""
var cycle_progress = time_of_day / day_night_cycle_duration
var brightness = cos(cycle_progress * TAU) * 0.5 + 0.5 # 0.0~1.0
# 環境光を更新
var ambient_color = Color.WHITE.lerp(Color.DARK_GRAY, 1.0 - brightness)
canvas_modulate.color = ambient_color
# 各ライトの表示/非表示を切り替え
for light in lights:
# 夜間はライトを強く、昼間は弱く
if brightness < 0.5:
light.energy = 1.5 # 夜間:ライト強化
else:
light.energy = 0.5 # 昼間:ライト弱化
func add_explosion_flash(position: Vector2, flash_strength: float = 3.0, radius: float = 200.0):
"""爆発フラッシュエフェクトを生成"""
var flash_light = PointLight2D.new()
flash_light.global_position = position
flash_light.energy = flash_strength
flash_light.color = Color.YELLOW_WHITE
flash_light.shadow_enabled = false
flash_light.blend_mode = Light2D.BLEND_MODE_ADD
add_child(flash_light)
# フラッシュを徐々に消す
var tween = create_tween()
tween.set_trans(Tween.TRANS_QUAD)
tween.set_ease(Tween.EASE_OUT)
tween.tween_property(flash_light, "energy", 0.0, 0.3)
tween.tween_callback(flash_light.queue_free)

もっと使いこなす:カスタマイズできるパラメータ
| 設定項目 | 説明 | 推奨値・用途 |
|---|---|---|
texture 選択 |
光源テクスチャ | Godot 内蔵の「light.svg」、またはカスタム画像。グラデーション=自然な光、円形=硬い光 |
shadow_enabled |
影の有効化 | ON は綺麗だが負荷大。モバイルなら OFF か最小限 |
blend_mode |
合成モード | ADD = 光源感(ろうそく、街灯)、SUB = 吸収感(不気味な影) |
z_index |
描画順序 | ライトが他のオブジェクトより手前/奥に見えるかを制御 |
| 複数ライト | 色と強度の組み合わせ | 赤ライト + 青ライトで紫の照明エリアを表現。複数を重ねて豊かな色 |
まとめ
PointLight2Dは、2Dゲームに立体感、雰囲気、そして演出力をもたらす優れたノードです。単なる「明るさ調整」ではなく、物理ベースのライティング計算により、リアルな陰影が自動生成されます。ホラーゲーム、ダンジョン、夜間ステージなど、照明が重要な場面では欠かせません。適切なテクスチャ、色、強度の調整により、ゲーム世界に深みと魅力が生まれます。
- PointLight2D は点光源を実装し、物理ベースのリアルなライティングを自動計算
- color、energy、blend_mode で光源の見た目と演出を細かく制御
- shadow_enabled で陰影を追加。ただし負荷に注意し、パフォーマンスバランスを取ること
次回はDirectionalLight2Dについて解説します。太陽や月のような遠距離光源を表現し、ゲーム全体の昼夜サイクルを実装するテクニックを学びます。
シリーズ:Godot 4 ノード解説
- 001〜094:各種ノード
- 091:TileMap
- 092:Camera2D
- 093:VisibleOnScreenNotifier2D
- 094:RemoteTransform2D
- 095:PointLight2D(この記事)
この記事はGodot 4.xをもとに執筆しています。


コメント