カメラのアングル自動切換えアプリに、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