今回はOculus Questの開発ネタをやっていきます。
内容的にはOculus Rift Sなどにもそのまま応用できるかと思います。
ゲーム開始時やシーン切替時の画面にフェード効果(フェードイン・フェードアウト)
をつけていきます。
このような演出を「画面遷移」「画面転換」「画面切り替え」「トランジッション」などというそうです。
間違えやすいですが、画面を暗くすることをフェードアウト
画面を明るくすることをフェードインといいます。
開発環境
Windows 10
Unity 2018.4.3f
Oculus Integration ver1.38
Oculus Quest
ALVR
先行研究
セットアップ
始めてVR開発をする方はこちらを参考にしてみてください
主要コンポーネント
OVR Screen Fade
フェードを行うコンポーネントもOculus Integrationに用意されています。
サンプルシーンの確認
Assets/SampleFramework/Usageに様々なサンプルシーンがあります。
学習や挙動の確認にとても有益です。見てみましょう。
実はOculus Screen Fadeは様々なシーンで既に使われています。
このコンポーネントはほとんどの場合、OVRCameraRigの中にあるCenterEyeAnchorにアタッチされています。
(AvaterGrabなど一部のシーン内のOVRCameraRigにはない)
OVR Screen Fade
インスペクターパラメーター
fadeTime
フェードをする時間、どちらかというとFade Durationといったほうがわかりやすいかも。
この値が2の場合、2秒後にフェードアウトを開始する・・・という意味ではなく。
2秒かけてフェードアウトをするという意味です。
fadeColor
フェードメッシュの色
初期値だと黒だが、この色を変えることができる。
fadeOnStart
フェードをするかどうか。
ここのチェックが外れているとフェードされず最初から表示される。
renderQueue
フェード用のメッシュで使われるレンダーキュー。
このメッシュの上に別の物をレンダリングする場合はここの数字を減らします。(未検証)
実際にやってみる
フェードイン
シーン開始時のフェードインをしてみます。
基本的にこのOVRScreenFadeがCenterEyeAnchorにアタッチされていれば勝手にフェードインされます。
ちなみにソースコード内で実際にフェードをしているのはFadeコルーチンになります。
FadeコルーチンはパラメータのfadeOnStartがtrueであればStartにて勝手に呼ばれます。
フェードアウト
シーン遷移時にフェードアウトをしてみます。
フェードアウト用のPublic関数がすでに用意されています。
この関数を外部から呼び出せば任意のタイミングでフェードアウトが可能です。
もっとフェードインフェードアウトを使いやすくする
先ほどのFadeコルーチンのサマリーにアルファ(透明度)を1から0にとありますが、
引数の値によっては0から1にすることもできます。
OVRScreenFadeにコードを追加してみます。
FadeOn()メソッドを追加しました。
これは最初と最後のアルファ値とディレイ値を取りオーバーロードされたFadeコルーチンを呼び出します。
Fadeコルーチンはディレイ値を元に遅延実行します。書いてる途中で思ったけどこれDelay必要ない
テスト用に以下のスクリプトを作成しました。
1秒後にフェードインがかかり、5秒後にフェードアウトがかかります。
このような形でFadeOnメソッドを呼び出せば簡単にシーン遷移時のフェード効果をつけることができます。
最初からフェード(画面が覆われた)状態にしておく
fadeOnStartを使わず手動でフェードインをする場合はSetFadeLevelで初期化する必要があります。
実はOnEnabledとAwakeで初期化処理が走っているのでここに少し手を加えます。
SetFadeLevel(1)を呼び出しておくことで、シーン開始に画面が覆われた状態から始めることができます。
まとめ
フェードをつけたい場合はOVRScreenFadeをCenterEyeAnchorにつける
フェードインは自動でやってくれるが、フェードアウトは別途スクリプトを書いて呼ばないといけない
OVRScreenFadeにちょっと手を加えてフェードインも手動で行うことができる
参考文献
UnityにおけるuGUIを使った画面切り替えの解説
公式リファレンス
https://developer.oculus.com/reference/unity/1.38/class_o_v_r_screen_fade
他間違っている箇所がありましたらコメントにお願いします。