のっぺりと均一に明るい2D画面と、松明の周りだけがぼうっと照らされ、壁の陰に暗がりが落ちる画面——同じマップでも、後者のほうが一気に「世界」に見えます。光と影は、飾りではなく 深みと雰囲気 を作り、プレイヤーの視線を導く演出です。
Godotの2Dライティングは、PointLight2D(光源)と LightOccluder2D(影を作る遮蔽物)の組み 合わせが基本。この記事では、光を出す・影を落とす・特定のオブジェクトだけ照らす、を押さえて、最後に懐中電灯を作ります。
この記事でわかること
- 光源・遮蔽物・被写体の 3要素 の役割
PointLight2Dの Texture(放射グラデ)とEnergy で光を作るLightOccluder2Dで 影を落とす 仕組みPointLight2DとDirectionalLight2Dの使い分け、懐中電灯の実装
2Dライティングの3要素
Godotの2Dライティングは、主に3つのノードの連携で成り立ちます。

| 要素 | 代表ノード | 役割 |
|---|---|---|
| 光源 | PointLight2D / DirectionalLight2D | 光を放つ。点光源や平行光源など種類を決める |
| 遮蔽物 | LightOccluder2D | 光を遮って影を作る形。物理の当たり判定とは別物 |
| 被写体 | Sprite2D / TileMap など | CanvasItem を継承するノード。照らされたり影に隠れたりする |
「光を出す人・光を遮る人・光を受ける人」の3役、と捉えると整理しやすいです。
PointLight2Dで光を作る
PointLight2D は、一点から全方位に光を放つ基本の光源です。追加しただけでは光りません—— Texture に光の形を与える のが最初の一歩です。

インスペクタで Texture の「空」をクリック →「新規 GradientTexture2D」を選び、その Fill を Radial にすると、中心が明るく外側へフェードする放射グラデができ、基本の光になります。あとは次を調整します。
- Energy :光の強さ(大きいほど明るい)
- Color :光の色(デフォルトは白)
- Shadow > Enabled :この光源で影を作るか(重いので必要な光だけオン)
LightOccluder2Dで影を落とす
影は自動では出ません。Godotに「何が光を遮るのか」を教える必要があり、それが LightOccluder2D です。

壁・柱・キャラなど、影を落とさせたいオブジェクトの 子ノード として LightOccluder2D を追加し、Occluder に OccluderPolygon2D を新規作成して、遮る形(多角形)を描きます。影を出すには次の3つが揃っている必要があります。
PointLight2DのShadow > Enabledがオン- 遮蔽物に
LightOccluder2D+OccluderPolygon2Dがある - 光源の
Shadow > Item Cull Maskと遮蔽物のマスクが一致している
「影が出ない」ときは、まずこの3点を確認しましょう(FAQも参照)。
PointLight2DとDirectionalLight2Dの使い分け
PointLight2D が点から放射状に光るのに対し、DirectionalLight2D は太陽や月のように、シーン全体へ一方向から平行に降り注ぎます。

| 特徴 | PointLight2D | DirectionalLight2D |
|---|---|---|
| 光の形 | 点から放射状 | 全体に平行 |
| 主な用途 | 松明・電球・魔法など特定位置の光 | 太陽・月・屋外の環境光 |
| 影の向き | 光源位置から全方向へ 伸びる | 光の角度で一方向へ伸びる |
| 負荷 | 多数置くと重くなりやすい | 通常1〜2個。比較的軽い |
屋外なら、まず DirectionalLight2D で全体の明るさと影の向きを決め、洞窟の入り口やキャンプファイアに PointLight2D を足す、という組み合わせが効果的です。
実践:懐中電灯を作る
3要素が分かったので、 プレイヤーに付いてきて、マウス方向を照らし、使うと電池が減る懐中電灯 を作ります。ホラーでも探索アクションでもサバイバルでも、「暗闇で手元だけ見える」演出はこれで作れます。

プレイヤーの子に PointLight2D(名前を Flashlight)を置いておきます。
extends CharacterBody2D
@onready var flashlight: PointLight2D = $Flashlight
@export var max_energy := 1.0
@export var drain_rate := 0.02 # 1秒あたりの消費
var energy := 1.0
func _ready() -> void:
energy = max_energy
flashlight.enabled = false
func _unhandled_input(event: InputEvent) -> void:
if event.is_action_pressed("toggle_light"):
flashlight.enabled = not flashlight.enabled # オン/オフ切り替え
get_viewport().set_input_as_handled()
func _process(delta: float) -> void:
if not flashlight.enabled:
return
energy = maxf(energy - drain_rate * delta, 0.0) # 電池を消費
if energy == 0.0:
flashlight.enabled = false # 切れたら消灯
flashlight.energy = lerpf(0.5, 1.5, energy / max_energy) # 残量で明るさが変わる
# マウス方向へ向ける(扇形にするには Texture を扇状の画像にする)
flashlight.rotation = (get_global_mouse_position() - global_position).angle()
func restore_energy(amount: float) -> void:
energy = minf(energy + amount, max_energy) # 電池を拾ったら回復
if energy > 0.0:
flashlight.enabled = true
ポイントは2つです。
- 光もただのプロパティ :
flashlight.enabled(オンオフ)、flashlight.energy(明るさ)、flashlight.rotation(向き)を毎フレーム触るだけで、電池切れで暗くなる懐中電灯になります。 - 扇形にしたいなら Texture を替える :
PointLight2Dは放射状なので、回転しても丸い光のまま。円錐(扇形)の光にしたいときは、Textureを扇状のグラデ画像にします。より凝った光の形は Fragment Shaderの基礎 で作り込めます。
よくある間違いとベストプラクティス

| よくある間違い | ベストプラクティス |
|---|---|
LightOccluder2D を置かず影が出ない | 影を落とすオブジェクト(か親)に LightOccluder2D + OccluderPolygon2D を付ける |
CanvasModulate を真っ黒にして何も見えない | 完全な黒ではなく、少し明るいグレー(例: #202020)にして最低限の視認性を残す |
OccluderPolygon2D の頂点が多すぎて重い | 形を表せる最小限の頂点に。TileMap は TileSet の Occlusion で最適化する |
| すべての光で影を有効にして重い | ゲームに効く重要な光だけ影オン。雰囲気づくりの補助光は影オフ |
Light Mask を使わず意図しない照らし方になる | 光源の Item Cull Mask と被写体の Light Mask でレイヤー分けする |
おまけ:先に知っておくと良いこと
- 法線マップでリアルに :
Sprite2Dに法線マップ(Normal Map)を設定すると、光の当たり方に凹凸の陰影が出て、平面のスプライトが立体的に見えます。 CanvasModulateで夜を作る :シーン全体を暗くするCanvasModulateを1つ置き、そこに光源を足すと、夜や洞窟の雰囲気が一気に出ます。- TileMapの影は TileSet で :マップの壁の影は、タイル1枚ずつでなく
TileSetの Occlusion レイヤーで設定すると軽く済みます。 - 凝った光はシェーダーで :ゆらめく炎や色収差などは Fragment Shaderの基礎 の領域です。
まとめ
- 3要素 :光源(
PointLight2D)・遮蔽物(LightOccluder2D)・被写体(Sprite2Dなど) - 光を作る :
PointLight2DのTextureに放射グラデを入れ、Energyで強さを調整 - 影を作る :遮蔽物に
LightOccluder2D+OccluderPolygon2D。光源側の影を有効化 - 使い分け :全体は
DirectionalLight2D、特定位置はPointLight2D
PointLight2D と LightOccluder2D を1組置くだけで、平面だった2Dが光と影のある世界に変わります。まずは暗いシーンに松明を1つ灯すところから。次は GPUParticles2Dのエフェクト で火の粉を足したり、Fragment Shaderの基礎 で光の表現を広げたりすると、画面がさらに豊かになります。