【Godot】Godot 2Dライティング入門: PointLight2Dと影の設定で実現する深みのある表現

作成: 2025-12-10最終更新: 2026-07-08

GodotのPointLight2DとLightOccluder2Dで2Dライティングと影を実装する方法を、光源・遮蔽物・被写体の3要素、影の仕組み、DirectionalLight2Dとの使い分け、懐中電灯の実装まで解説します。

のっぺりと均一に明るい2D画面と、松明の周りだけがぼうっと照らされ、壁の陰に暗がりが落ちる画面——同じマップでも、後者のほうが一気に「世界」に見えます。光と影は、飾りではなく 深みと雰囲気 を作り、プレイヤーの視線を導く演出です。

Godotの2Dライティングは、PointLight2D(光源)と LightOccluder2D(影を作る遮蔽物)の組み合わせが基本。この記事では、光を出す・影を落とす・特定のオブジェクトだけ照らす、を押さえて、最後に懐中電灯を作ります。

暗い2Dシーンで、点光源がキャラクターと壁を照らし、壁が影を落としている雰囲気のあるライティングのイメージ

この記事でわかること

  • 光源・遮蔽物・被写体の 3要素 の役割
  • PointLight2DTexture(放射グラデ)とEnergy で光を作る
  • LightOccluder2D影を落とす 仕組み
  • PointLight2DDirectionalLight2D の使い分け、懐中電灯の実装

Sponsored

2Dライティングの3要素

Godotの2Dライティングは、主に3つのノードの連携で成り立ちます。

2Dライティングの3要素。光源(PointLight2D)・遮蔽物(LightOccluder2D)・被写体(Sprite2D)が合わさって、光と影のあるシーンになる
要素代表ノード役割
光源PointLight2D / DirectionalLight2D光を放つ。点光源や平行光源など種類を決める
遮蔽物LightOccluder2D光を遮って影を作る形。物理の当たり判定とは別物
被写体Sprite2D / TileMap などCanvasItem を継承するノード。照らされたり影に隠れたりする

「光を出す人・光を遮る人・光を受ける人」の3役、と捉えると整理しやすいです。

PointLight2Dで光を作る

PointLight2D は、一点から全方位に光を放つ基本の光源です。追加しただけでは光りません—— Texture に光の形を与える のが最初の一歩です。

PointLight2DはTextureに放射状のGradientTexture2D(Fill: Radial)を設定すると、それがそのまま光の形になる

インスペクタで Texture の「空」をクリック →「新規 GradientTexture2D」を選び、その FillRadial にすると、中心が明るく外側へフェードする放射グラデができ、基本の光になります。あとは次を調整します。

  • Energy :光の強さ(大きいほど明るい)
  • Color :光の色(デフォルトは白)
  • Shadow > Enabled :この光源で影を作るか(重いので必要な光だけオン)

LightOccluder2Dで影を落とす

影は自動では出ません。Godotに「何が光を遮るのか」を教える必要があり、それが LightOccluder2D です。

LightOccluder2Dの形が光を遮り、光源と反対側に影ができる仕組み。遮る形が影になる

壁・柱・キャラなど、影を落とさせたいオブジェクトの 子ノード として LightOccluder2D を追加し、OccluderOccluderPolygon2D を新規作成して、遮る形(多角形)を描きます。影を出すには次の3つが揃っている必要があります。

  1. PointLight2DShadow > Enabled がオン
  2. 遮蔽物に LightOccluder2DOccluderPolygon2D がある
  3. 光源の Shadow > Item Cull Mask と遮蔽物のマスクが一致している

「影が出ない」ときは、まずこの3点を確認しましょう(FAQも参照)。

Sponsored

PointLight2DとDirectionalLight2Dの使い分け

PointLight2D が点から放射状に光るのに対し、DirectionalLight2D は太陽や月のように、シーン全体へ一方向から平行に降り注ぎます。

PointLight2Dは点から放射状で全方向に影が伸び、DirectionalLight2Dは全体に平行で一方向に影が伸びる比較図
特徴PointLight2DDirectionalLight2D
光の形点から放射状全体に平行
主な用途松明・電球・魔法など特定位置の光太陽・月・屋外の環境光
影の向き光源位置から全方向へ伸びる光の角度で一方向へ伸びる
負荷多数置くと重くなりやすい通常1〜2個。比較的軽い

屋外なら、まず DirectionalLight2D で全体の明るさと影の向きを決め、洞窟の入り口やキャンプファイアに PointLight2D を足す、という組み合わせが効果的です。

実践:懐中電灯を作る

3要素が分かったので、 プレイヤーに付いてきて、マウス方向を照らし、使うと電池が減る懐中電灯 を作ります。ホラーでも探索アクションでもサバイバルでも、「暗闇で手元だけ見える」演出はこれで作れます。

懐中電灯の演出。プレイヤーからマウス方向へ扇形の光が伸び、電池ゲージが減り、energyで明るさが変わる

プレイヤーの子に 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の基礎 で作り込めます。
Sponsored

よくある間違いとベストプラクティス

CanvasModulateを真っ黒にすると何も見えないが、少し明るいグレーにすると最低限のシルエットが見える比較図
よくある間違いベストプラクティス
LightOccluder2D を置かず影が出ない影を落とすオブジェクト(か親)に LightOccluder2DOccluderPolygon2D を付ける
CanvasModulate を真っ黒にして何も見えない完全な黒ではなく、少し明るいグレー(例: #202020)にして最低限の視認性を残す
OccluderPolygon2D の頂点が多すぎて重い形を表せる最小限の頂点に。TileMapTileSet の 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 など)
  • 光を作るPointLight2DTexture に放射グラデを入れ、Energy で強さを調整
  • 影を作る :遮蔽物に LightOccluder2DOccluderPolygon2D。光源側の影を有効化
  • 使い分け :全体は DirectionalLight2D、特定位置は PointLight2D

PointLight2DLightOccluder2D を1組置くだけで、平面だった2Dが光と影のある世界に変わります。まずは暗いシーンに松明を1つ灯すところから。次は GPUParticles2Dのエフェクト で火の粉を足したり、Fragment Shaderの基礎 で光の表現を広げたりすると、画面がさらに豊かになります。