はじめに
Godot 4では2Dゲームに奥行きと雰囲気を与えるための照明システムが用意されています。その中でもDirectionalLight2Dは、画面全体を一方向から均一に照らすノードで、太陽光や月光などの環境光を表現する際に活躍します。
このノードを使いこなすことで、昼間のゲームシーンと夕暮れのシーンを色や明るさで簡単に描き分けたり、斜め光による影を使って画面に立体感を与えたりできます。
DirectionalLight2Dとは?
DirectionalLight2Dは「窓から差し込む日光」のようなノードです。特定の位置からではなく、画面全体を一方向から均一に照らし、その光の向きはノードのrotationプロパティで決定されます。
継承ツリー:
DirectionalLight2D → Light2D → Node2D → CanvasItem → Node
Light2Dを親クラスとしているため、基本的な照明機能(color、energyなど)を継承しながら、DirectionalLight2D特有の全画面照明機能を持っています。PointLight2Dとは異なり、位置による減衰がなく、どこに配置してもその効果は変わりません。

このノードを使うべき場面
昼間の太陽光表現
最も基本的な用途です。色を黄白色に設定し、energyを1.0~1.5程度にすることで、昼間の自然な照明を表現できます。
斜め光による影のあるシーン
rotationを45度程度に設定し、shadow_enabledをtrueにすることで、LightOccluder2Dと組み合わせて影を投影できます。これにより、キャラクターやオブジェクトが浮き上がって見え、ゲームに立体感が生まれます。
夕暮れの赤い光演出
色をオレンジ色や赤色に変更し、energyを少し下げることで、黄昏時や夜間前のドラマティックな雰囲気を作れます。
横スクロールゲームの環境光
カメラの移動に関わらず、常に一定方向から光が当たるため、シーン全体の環境光として使用するのに適しています。
別のノードが適切な場面
PointLight2Dは、ランタンやたいまつなど「位置がある光源」に使います。OmniLight3D(3D)では全方向に光が広がります。単にスクリーン全体を明るくするだけなら、CanvasLayerの背景色やmodulateを変更する方法もあります。
主なプロパティと機能
| プロパティ名 | 型 | 説明 | デフォルト値 |
|---|---|---|---|
color |
Color | 光の色。RGB値で指定 | Color.WHITE |
energy |
float | 光の強さ。0=消灯、1=標準、2以上=より明るい | 1.0 |
height |
float | 光源の高さ。影の角度に影響。0に近いほど平坦な影 | 0.0 |
shadow_enabled |
bool | 影を投影するか。trueでLightOccluder2Dと連動 | false |
shadow_color |
Color | 影の色。通常は暗い色を使用 | Color.BLACK |
blend_mode |
enum | 光と背景の合成方式。ADD/SUB/MIX | Light2D.BLEND_MODE_ADD |
GDScriptコード例1:昼間から夕暮れへの光の色遷移
extends Node2D
@onready var directional_light = $DirectionalLight2D
var is_evening = false
var transition_speed = 0.3 # 0~1で遷移速度を制御
func _ready():
# 初期状態:昼間(黄白色)
directional_light.color = Color.WHITE
directional_light.energy = 1.2
func _process(delta):
# キー入力で昼間 ↔ 夕暮れを切り替え
if Input.is_action_just_pressed("ui_select"):
is_evening = not is_evening
# 現在のターゲット色を決定
var target_color = Color.WHITE if not is_evening else Color(1.0, 0.6, 0.3)
var target_energy = 1.2 if not is_evening else 0.8
# スムーズに遷移
directional_light.color = directional_light.color.lerp(target_color, transition_speed * delta)
directional_light.energy = lerp(directional_light.energy, target_energy, transition_speed * delta)
GDScriptコード例2:時間帯に応じた動的な光の向きと色の変更
extends Node2D
@onready var directional_light = $DirectionalLight2D
var time_of_day = 6.0 # 0~24時間
func _ready():
update_light_for_time()
func _process(delta):
# 時間を進める(1秒 = 1分相当)
time_of_day += delta / 60.0
if time_of_day >= 24.0:
time_of_day = 0.0
update_light_for_time()
func update_light_for_time():
# 時間帯に応じた光の向きを計算
var hour_angle = (time_of_day / 24.0) * TAU # 0~2πラジアン
directional_light.rotation = hour_angle
# 時間帯に応じた色を決定
var light_color: Color
var light_energy: float
if time_of_day >= 6.0 and time_of_day < 8.0: # 朝焼け
var progress = (time_of_day - 6.0) / 2.0
light_color = Color(1.0, 0.5, 0.3).lerp(Color.WHITE, progress)
light_energy = 0.6 + progress * 0.6
elif time_of_day >= 8.0 and time_of_day < 18.0: # 昼間
light_color = Color.WHITE
light_energy = 1.2
elif time_of_day >= 18.0 and time_of_day < 20.0: # 夕焼け
var progress = (time_of_day - 18.0) / 2.0
light_color = Color.WHITE.lerp(Color(1.0, 0.4, 0.2), progress)
light_energy = 1.2 - progress * 0.8
else: # 夜間
light_color = Color(0.1, 0.1, 0.3)
light_energy = 0.2
directional_light.color = light_color
directional_light.energy = light_energy

もっと使いこなす:カスタマイズできるパラメータ
| カスタマイズ項目 | 設定方法 | 効果 |
|---|---|---|
| 影の濃さ調整 | directional_light.shadow_color = Color(0.3, 0.3, 0.3, 1.0) |
影が薄くなり、より自然な見た目に。黒(0,0,0)から薄い灰色(0.3,0.3,0.3)に変更するのが一般的 |
| 光源の高さを変更 | directional_light.height = 1.5 |
影の角度が変わり、光源が高いほど影が短くなる。立体感を調整可能 |
| 加算合成から減算合成に | directional_light.blend_mode = Light2D.BLEND_MODE_SUB |
光が「明るさを加える」から「暗さを追加する」に変わり、ホラーゲームなどに有効 |
| 特定のレイヤーのみ照らす | directional_light.item_cull_mask = 2 |
複数のCanvasLayerを使用時、特定のレイヤーにだけ光を当てることが可能 |
| 回転アニメーション | var tween = create_tween() |
光の方向をスムーズにアニメーション。ゲームの進行に合わせて時間経過を表現 |
まとめ
DirectionalLight2Dは、ゲーム全体の「照明環境」を作る強力なツールです。色と明るさを変えるだけで、プレイヤーに与える心理的な印象が大きく変わります。シンプルなプロパティながら、使い方次第で非常に豊かな表現が可能になります。
- DirectionalLight2Dは画面全体を一方向から均一に照らす環境光用ノード
- colorとenergyの組み合わせで、昼間から夜間まで様々な時間帯の雰囲気を演出可能
- shadow_enabledをtrueにしてLightOccluder2Dと組み合わせることで、影による立体感を実現
次回は、DirectionalLight2Dの影を活かすためのLightOccluder2Dについて解説します。
シリーズ:Godot 4 ノード解説
このシリーズは、Godot 4でよく使用されるノードの使い方を詳しく解説しています。
- 001〜095: 各種ノード
- 096: DirectionalLight2D(このページ)
- 097: LightOccluder2D
- 098: ParallaxBackground
- 099: ParallaxLayer
- 100: AudioStreamPlayer2D
この記事はGodot 4.xをもとに執筆しています。


コメント