takeyohのおぼえがき

気になったこと、試したことの記録です。

画面全体をフェードイン、フェードアウトさせる。

カメラのアングル自動切換えアプリに、AFKモード(操作しない状態に登場するカメラワークのモード)を作りました。
ただ、そのAFKモードはアングルが5種類あるのですが、これが切り替わるたびに画面全体をフェードイン、フェードアウトさせたかったのですが、やり方がわからずチャットで聞いてみたら、あ~るさんが教えてくださいました。あ~るさん、ありがとうございます!
ということで、その実装方法の覚書です。

assettocorsaのCSPにおけるluaアプリでは、callbackという機能がいくつかって、その中のUI callbackを使う手法です。
これは、ゲーム中の画面にフルスクリーンUIを生成する機能・・・だそうです。(公式WIKIより。でも細かいことはよくわからないです。)

実装方法です。
まず、manifest.iniに以下を追記します。

[UI_CALLBACKS]
IN_GAME = fullscreenUI

これで、制御可能なフルスクリーンUIが準備されます。
続いて、luaアプリ側での制御です。今回は、画面全体をフェードイン・アウトさせる機能を実装しました。

local fadeCount = 0
local fadeFlag = "clear"
local screenSize = vec2(ac.getSim().windowWidth,ac.getSim().windowHeight)
function script.fullscreenUI(dt)
  if fadeFlag =="fadeIn" and fadeCount >= 0 then
    fadeCount = fadeCount - dt * 2
  elseif fadeFlag == "fadeOut" and fadeCount <= 1 then
    fadeCount = fadeCount + dt * 2
  elseif fadeFlag == "black" then
    fadeCount = 1    
  elseif fadeFlag == "clear" then
    fadeCount = 0
  end
  if fadeCount > 0 then
    ui.drawRectFilled(vec2(0,0), screenSize,rgbm(0,0,0,fadeCount))
  end
end

先ほど追加したフルスクリーンUI自体の制御は、script.fullscreenUI(dt)という関数で制御します。(4行目)
ここでは、fadeFlagという変数に特定の文字列を入れることで、制御を分岐させています。
3行目は、ゲーム画面のサイズを定義しています。このフルスクリーンUIすべてを埋め尽くす四角を書いて、その透明度を変化させることで、フェードイン、フェードアウトを制御しています。
if文でいろいろ分岐制御(5~13行目)してますが、fadeInなら黒から徐々に明るく、fadeOutなら逆に画面を徐々に黒く、blackなら画面を真っ黒に、clearなら明るくするという制御になります。
15行目が実際の四角を表示している部分です。
前後のif文はclear(暗くしない)状態では、画面いっぱいの四角自体を表示しないようにするためです。
大した変化はないと思いますが、一応負荷軽減のための策です。(^^;

以上です。
実際にフェードイン・アウトしている様子はこちら。
youtu.be

/* -----codeの行番号----- */