光を当てた部分だけ見えるようになるマテリアル


添付した画像のような、当てられた光によって不透明度が変わるマテリアルを作りたいです!教えて欲しいです!

この説明では、スポットライトからの直接光のみ影響を与えます
2025-01-05 12-19-54

メッシュ距離フィールドの生成にチェックが入っていることを確認してください。

考え方
当てられた光=スポットライトの範囲内にライントレースを実行して光を再現
1スポットライトの範囲内にライントレースを実行
2ヒットした場所でアクタを表示
3アクタの場所のマテリアルの透明度を変える

作成するアセット

作り方

BP_Hit レンダリングされず、コリジョンのないメッシュ

親クラスをActorでBPを作成
コンポーネント→追加からSphereを追加、
詳細から
トランスフォームの拡大・縮小を(0.3 0.3 0.3)に変更
コリジョンプリセットをNoCollisionに変更し、
Render in Main PassRender in Depth Passのチェックを外します。



M_illuminated BP_Hitと重なっている部分を見えるようにする

詳細からBlendModeをMaskedに変更し、TwoSidedにチェックを入れ、


TextureSampleをパラーメーターに変換し、ノードをこのように組みます。

MI_illuminated 異なるTextureを使用可能にする

コンテンツブラウザからM_illuminatedで右クリックし、マテリアルインスタンスを作成
詳細から
Paramにチェックを入れて、使いたいTextureをセットしましょう

影響を受けるメッシュの設定

透明度を変える処理を適用させたいメッシュをエディタまたはBP内で選択し、詳細から
マテリアルにMI_illuminatedを設定し、
Affect Distance Field Lightingのチェックを外し、
Tagsの要素を追加し、Traceと入力します。

例:SKM_Quinn_Sampleにセットする場合


image
image

BP_LightTrace 照らされた場所にBP_Hitを表示する

親クラスをActorでBPを作成
コンポーネント→追加からSpotLightとArrowを追加


変数をこのように追加します


上から6番目のVector and Childは変数のタイプをマップにして、
マップの値タイプをChild Actor Componentにして下さい

入力可能な変数の説明(ライトの範囲とBP_Hitの範囲を可視化し、BP_Hitの中心にArrowを追加してテストしました)

Radius ライントレースを行う距離

範囲「0以上」

テスト値「 700ー1400」

ConeAngle 円錐の頂点角

範囲「0以上90以下」

テスト値「5ー15」

Num_Rings 配置するBP_Hitのリングの数

範囲「0以上」

コメント:精度は上がりますが、処理が重くなります
テスト値「2ー7」

HideDistance ひとつ前に配置されたポイントとの間隔が数値以下の時に隠す

範囲「0以上」

コメント:近づいた時に精度をあまり落とさずに、処理が軽くなります。
テスト値「 0ー25」

PointScale 配置するBP_Hitのサイズ倍率

範囲「0以上」デフォルト「1(リング上の前後のポイント(誤差あり)(外周以外)と、内外のリングとの距離がBP_Hitの半径)」

コメント:値を大きくしすぎると影の部分もカバーされてしまいます。
テスト値「1ー2」

これ以外のものは値の入力不可能です。

ノードの組み方

BeginPlayから



Add Child Actor ComponentノードのChild Actor ClassはBP_Hitにしてください
Relative Transform LocationのYが1111.0となっていますが、0で大丈夫です。 :bowing_man:

折りたたんでいたノード1

折りたたんでいたノード2

極座標のθをConeAngleとして、変数の値を変更してもBP_Hitが全てConeAngle内に入るようにNum_Rings分のリングを計算しています。
そして更新用にこれを追加してください。

カスタムイベント「Update」は詳細からエディタで呼び出すにチェックを入れておきましょう

BeginPlayからのノードの全体像

次にTickから

(注意:PringStringノードは、Print to Logのチェックを外し、Keyを設定してください。)


カスタムイベント「Trace」も詳細からエディタで呼び出すにチェックを入れておきましょう


このPrintStringの値が1(BP_Hitの最小スケール)の状態で近づくと精度が悪くなります。

Tickからのノードの全体像

変数値をテストする方法
レベルにBP_LightTraceを配置し、詳細のデフォルトから変数値を変更し、
1-Update Vector BeginPlayからの処理(入力された値でベクトルを再計算)
2-Trace Tickからの処理(ライントレースを実行し、BP_Hitを配置)
の順で押すとテスト出来ます。

使い方
ライトを持たせたいアクタのコンポーネント→追加からChildActorを追加
詳細のChildActorClassを作成したBP_LightTraceに変更

BP_TopDownCharacterに持たせる場合


変数LightActive

True ライントレースを実行
False ライントレースを実行せず、BP_Hitを隠す

コメント:ライントレースが必要ないときはFalseにすると処理が軽くなります。

分からない点があれば聞いてください :slightly_smiling_face:
参考
https://youtu.be/N_pq2RYTG04

1 Like