2つの方法があるようです。
Game.FadeOutGame
FadeOutGameを使います。
画面を徐々に暗くさせるには、以下のようにします。
323 (papyrus)
Game.FadeOutGame(true, true, 0.0, 1.0)
1秒かけて徐々に暗くなります。いわゆるフェードアウトです。この関数は処理を待たないので、即座に次の行の処理が始まります。
画面を徐々に明るくさせるには、以下のようにします。
326 (papyrus)
Game.FadeOutGame(false, true, 0.0, 1.0)
真っ暗な状態から1秒かけて徐々に明るくなります。いわゆるフェードインです。
ポイントが3つあります。まず、この関数は画面処理を上書きできます。エリア移動でロード画面を挟むと、画面処理が上書きされます。つぎに、第4引数に0を指定すると挙動がおかしくなります。そして、画面処理が終わると即座に通常の明るい状態に戻ります。
フェードアウトさせてからしばらく真っ暗にさせておきたい場合は、以下のように重ね掛けすればできます。
328 (papyrus)
Game.FadeOutGame(true, true, 0.0, 1.1) ; 1.1秒かけて暗くする
Utility.Wait(1.0) ; ほぼ暗くなるまで待つ
Game.FadeOutGame(false, true, 30.0, 0.1) ; 真っ暗な状態で30秒後に一気に明るくする
; ここで画面が暗いうちにしたいことをする
; ここでエリア移動のロードが発生すると、30秒を待たずともロード完了後は強制的に明るくなる
; ロードが発生しないのなら、30秒経つ前に以下のコードで即座にフェードインできる
;Game.FadeOutGame(false, true, 0.0, 1.0)
; 何もしないのなら、30秒が経過したら明るくなる
FadeOutGameとFadeOutGameの間に隙間の時間ができると、画面が一瞬表示されてしまうので、0.1秒だけ重ねるのがポイントです。
ImageSpaceModifier
FadeToBlackHoldImodなどのImageSpaceModifierを使う方法です。
ApplyまたはApplyCrossFadeで適用し、Removeで解除です。
この方法はENB環境では動作しないようです。
ENBでも動作するようにするにはenbeffect.fxに手をいれます。
どこでもいいので、できるだけ上の方に以下のコードを追加します。
enbeffect.fx その1 (papyrus)
float Empty_Row0 <
string UIName="-------------------FADE"; string UIWidget="spinner"; float UIMin=0.0; float UIMax=0.0;
> = {0.0};
bool EnableFade
<
string UIName="Enable Fade Transition";
> = {true};
PS_Drawという関数を探して、その中に以下のコードを追加します。
enbeffect.fx その2 (papyrus)
// PS_Drawという関数を探して
float4 PS_Draw(VS_OUTPUT_POST IN, float4 v0 : SV_Position0) : SV_Target
// (中略)
// この行を探して
float grayadaptation=TextureAdaptation.Sample(Sampler0, IN.txcoord0.xy).x;
// ここから追記
if (EnableFade)
{
float3 fade = Params01[5].xyz;
float fade_weight = Params01[5].w;
color.rgb = lerp(color.rgb, fade, fade_weight); // fade current scene to specified color
}
// ここまで追記
ゲームの中でENBのコントロールパネルを開くと、ENBEFFECT.FXのところにEnable Fade Transitionという項目が増えています。これにチェックを入れるとImageSpaceModifierによるブラックアウトが効くようになります。