PointLight2D, Canvas Modulate)エリアの一部のみ暗くする方法

■シーン全体を暗くする通常の場合

シーン全体をcanvas modulateで暗くして、PointLight2Dをプレイヤーに持たせて、 以下のように暗いエリアを光で照らしながら探索する、ということができます。

・以下のように真ん中がプレイヤー、光がプレイヤーの前方に出るようにしたい


・エリアのシーンにcanvas modulateノードを追加


・追加したcanvas modulateノードのcolorを編集、どの程度暗くするか決める

・PointLight2Dはプレイヤーのシーンにノードとして追加。 プレイヤーの向きに合わせてライトの位置を調整。

(作りたい光の画像を作成、textureで読み込みます。)


・画像はacepriteというドット絵作成ツールで作りました。

(①:gradient toolを選ぶ/②radial gradientを選ぶ/③背景色設定をクリック/④を透明(R,G,B,Aすべて0)にする/⑤光の色を選ぶ(ここでは白)/⑥ドラッグして円形の光を作成)



■一部エリアのみ暗くする方法
しかし、canvas modulateはどのようにシーン内に配置しても、結局シーン全体に影響するようで、例えば一部の部屋だけ暗くする、といったことができません。
それを行いたく、以下の部屋の壁を透明にする方法を応用して、colorのRGBの部分を0.3にする、として、暗くしてみました。
https://godot-biginner.blogspot.com/2025/05/tilemaplayer.html


ただ、どうも光への反応が悪く、照らした箇所が少しは明るくなるのですが、canvas modulateと比べると暗く、わかりづらいライトになってしまいました。この方法は却下。

良い方法が思いつかず、調べると以下情報が見つかりました。
明るいライトだけでなく、暗くするライトも設定できるようで、それを使うと良いようです。
https://www.reddit.com/r/godot/comments/vnnc4v/can_canvas_modulate_be_used_only_on_one_portion/?tl=ja

・PointLight2Dのインスペクタの、Blend Modeを、subtract(引き算)に設定すると、
 暗くするライトになる

・以下暗くしたい箇所を、上記引き算ライトで覆うと、暗くなる

・以下のように、場所によって暗くライトが必要なところと、
 通常の明るさの場所を、同じシーンの中で分けることができた




また、シーンをあらかじめ分けて、暗い部屋のシーンにはcanvas modulateを持たせ、通常の部屋には持たせない。各々の部屋を上位のシーンにノードとして持たせ統合、といった方法もあるようです。
ただ、これを行うと、シーンの作り方がライティングのためだけに変更しなくてはならないので、上記の暗いライトを使用する方法が、手っ取り早いように思います。
ただし、暗い部屋と明るい部屋が近接する場合、ライトの画像を部屋の形に合わせてカスタマイズする必要がありそうです。



コメント

このブログの人気の投稿

プラグイン(godot sqlite)を含めてエクスポートすると、データの更新ができない問題

初心者に良い本は? → 『 ゆるっとはじめるGodot Engine ゲームプログラミング 』

他シーンからシグナルを送る方法