はじめに
Godot 4で3Dシーンに奥行きのある照明を加える時、単なる均一な光では足りないことがあります。懐中電灯の光、街灯の明かり、舞台のスポットライト——こうした「特定方向に限定された光」を表現するのがSpotLight3Dです。
本記事では、SpotLight3Dの基本的な使い方から応用テクニックまで、実践的なコード例を交えて解説します。
SpotLight3Dとは?
SpotLight3Dは、光源から特定方向に円錐状に光を照射するノードです。懐中電灯や舞台照明のように、角度と距離で照射範囲が決まります。
継承ツリー:
SpotLight3D → Light3D → VisualInstance3D → Node3D → Node → Object
DirectionalLight3D(太陽のように無限遠から平行光線)やOmniLight3D(電球のように全方向に光る)と異なり、SpotLight3Dは「円錐形の範囲内だけを照らす」という制限があります。この特性が、リアルな局所照明表現を可能にします。
このノードを使うべき場面
活躍する場面:
- FPS ゲームの懐中電灯・ヘッドライト
- 街灯や路面照明、夜間ステージの環境光
- 舞台演出のスポットライト
- セキュリティカメラの照明範囲表現
- 車のヘッドライトやテールランプの再現
使わない場面:
- 太陽光(広大で無限遠:DirectionalLight3Dを使う)
- 室内の天井照明全体(OmniLight3Dで十分)
主なプロパティと機能
SpotLight3Dの基本的なプロパティを表にまとめました:
| プロパティ | 型 | 説明 | デフォルト値 |
|---|---|---|---|
| light_color | Color | 光の色(RGB) | white(1,1,1,1) |
| light_energy | float | 光の明るさ | 1.0 |
| spot_range | float | 光が届く最大距離(メートル) | 5.0 |
| spot_angle | float | 円錐の広がり角度(度) | 45.0 |
| spot_angle_attenuation | float | 角度の周辺での減衰(0〜1) | 1.0 |
| shadow_enabled | bool | 影を描画するか | false |
基本的な使用例:
extends Node3D
@onready var spotlight = $SpotLight3D
func _ready():
# 懐中電灯の設定
spotlight.light_color = Color.WHITE
spotlight.light_energy = 2.0
spotlight.spot_range = 20.0 # 20メートル先まで光が届く
spotlight.spot_angle = 30.0 # 30度の円錐状
spotlight.shadow_enabled = true # 影を有効化
func _process(delta):
# プレイヤーのカメラに追従(懐中電灯)
spotlight.global_position = $Camera3D.global_position
spotlight.global_rotation = $Camera3D.global_rotation

街灯の実装例:
extends Node3D
@onready var spotlight = $SpotLight3D
func _ready():
# 街灯の設定:暖色で下向き
spotlight.light_color = Color(1.0, 0.9, 0.7) # 暖色黄色
spotlight.light_energy = 3.0
spotlight.spot_range = 15.0
spotlight.spot_angle = 60.0
spotlight.shadow_enabled = false
# ノードの方向を下向きに
rotation.x = PI / 4 # 45度下を向く
func toggle_light():
spotlight.visible = !spotlight.visible
DirectionalLight3D・OmniLight3D・SpotLight3D の比較
3種類の光源がどう異なるかを理解することは、照明設計の鍵です:
| 光源 | 照射パターン | 到達範囲 | 用途例 | パフォーマンス |
|---|---|---|---|---|
| DirectionalLight3D | 平行光線(無限遠から) | 無制限(シーン全体) | 太陽光、月光 | 高速(1シーンに1〜2個推奨) |
| OmniLight3D | 全方向球面状 | spot_rangeで制限 | 電球、懐中電灯(無指向) | 中程度 |
| SpotLight3D | 円錐状(指向性) | spot_rangeで制限 | 街灯、舞台照明、ヘッドライト | 中程度(指向性で最適化される) |
もっと使いこなす:カスタマイズできるパラメータ
まずは基本を動かしてみてから、余裕が出たら試してみてください。
| パラメータ | 設定値の例 | 効果 |
|---|---|---|
| light_energy | 0.5 〜 5.0 | 明るさの段階的調整。夜間は低め、ステージ照明は高め |
| spot_range | 5.0 〜 50.0 | 懐中電灯(5〜15)、街灯(20〜40)、舞台(30〜60) |
| spot_angle | 15.0 〜 90.0 | 狭い(15度)でスポット効果強、広い(60度以上)で拡散光 |
| spot_angle_attenuation | 0.5 〜 1.0 | 周辺の減衰。1.0で急峻、0.5で緩やか |
| shadow_enabled | true/false | 影の計算。有効化で見栄えup、但し負荷増 |
| light_color | Color値 | 色温度調整。暖色(街灯)、寒色(SF)、RGB指定で演出 |
まとめ
SpotLight3Dは「限定された方向に光を放つ」という特性により、現実的で印象的な照明を3Dシーンに加えます。懐中電灯から舞台照明まで、多くのゲーム演出で活躍するノードです。
- spot_range と spot_angle の組み合わせで円錐形を自由に設計できる
- light_color で色温度を調整し、昼夜や雰囲気の表現が可能
- shadow_enabled は見栄えと負荷のトレードオフなので、プロトタイプ段階から検討を
次回は WorldEnvironment について解説します。シーン全体の環境(空・霧・グロー)を統合的に設定するノードです。
この記事はGodot 4.xをもとに執筆しています。
シリーズ:Godot 4 ノード解説
001〜040:各種ノード
- 041:Control
- 042:Button
- 043:Label
- 044:TextEdit
- 045:Panel
- 046:VBoxContainer
- 047:AnimationPlayer
- 048:Timer
- 049:Area3D
- 050:RigidBody3D
- 051:CharacterBody3D
- 052:CollisionShape3D
- 053:MeshInstance3D
- 054:Node3D
- 055:Camera3D
- 056:Sprite3D
- 057:DirectionalLight3D
- 058:OmniLight3D
- 059:ReflectionProbe
- 060:VisibleOnScreenNotifier3D
- 061:SpotLight3D
- 062:WorldEnvironment
- 063:AudioStreamPlayer3D
- 064:GPUParticles3D
- 065:CSGBox3D
- 066:GridMap
- 067:Decal
- 068:OccluderInstance3D
- 069:LightmapGI
- 070:SubViewport


コメント