Raspberlyのブログ

Raspberlyのブログ

Unityネタをメインとした技術系ブログです。にゃんこ大戦争や日常なども。そろそろブログタイトル決めたい

【Oculus Quest開発メモ】シーン遷移時に画面にフェード効果をつける OVR Screen Fade編【Unity】

 

今回はOculus Questの開発ネタをやっていきます。
内容的にはOculus Rift Sなどにもそのまま応用できるかと思います。

ゲーム開始時やシーン切替時の画面にフェード効果(フェードイン・フェードアウト)
をつけていきます。

このような演出を「画面遷移」「画面転換」「画面切り替え」「トランジッション」などというそうです。

 

f:id:Raspberly:20190721114647g:plain

f:id:Raspberly:20190720213058p:plain

間違えやすいですが、画面を暗くすることをフェードアウト
画面を明るくすることをフェードイン
といいます。

 

 

開発環境

Windows 10

Unity 2018.4.3f

Oculus Integration ver1.38

Oculus Quest

ALVR

 

 

 

先行研究

qiita.com

forums.oculusvr.com

 

 

 

セットアップ

始めてVR開発をする方はこちらを参考にしてみてください

raspberly.hateblo.jp

 

 

 

 

 

主要コンポーネント

OVR Screen Fade

フェードを行うコンポーネントもOculus Integrationに用意されています。

 

 

サンプルシーンの確認

Assets/SampleFramework/Usageに様々なサンプルシーンがあります。
学習や挙動の確認にとても有益です。見てみましょう。

実はOculus Screen Fadeは様々なシーンで既に使われています。
このコンポーネントはほとんどの場合、OVRCameraRigの中にあるCenterEyeAnchorにアタッチされています
(AvaterGrabなど一部のシーン内のOVRCameraRigにはない)

f:id:Raspberly:20190719233423p:plain



 

 

 

 

 

OVR Screen Fade

インスペクターパラメーター

f:id:Raspberly:20190720000710p:plain

fadeTime

フェードをする時間、どちらかというとFade Durationといったほうがわかりやすいかも。
この値が2の場合、2秒後にフェードアウトを開始する・・・という意味ではなく。
2秒かけてフェードアウトをするという意味です。

fadeColor

フェードメッシュの色
初期値だと黒だが、この色を変えることができる。

f:id:Raspberly:20190720003913g:plain

fadeOnStart

フェードをするかどうか。
ここのチェックが外れているとフェードされず最初から表示される。

renderQueue

フェード用のメッシュで使われるレンダーキュー。
このメッシュの上に別の物をレンダリングする場合はここの数字を減らします。(未検証)

 

 

 

 

 

 

実際にやってみる

フェードイン

シーン開始時のフェードインをしてみます。
基本的にこのOVRScreenFadeがCenterEyeAnchorにアタッチされていれば勝手にフェードインされます。

ちなみにソースコード内で実際にフェードをしているのはFadeコルーチンになります。

 

FadeコルーチンはパラメータのfadeOnStartがtrueであればStartにて勝手に呼ばれます。

 

 

フェードアウト

シーン遷移時にフェードアウトをしてみます。
フェードアウト用のPublic関数がすでに用意されています。

 

この関数を外部から呼び出せば任意のタイミングでフェードアウトが可能です。

f:id:Raspberly:20190720101727g:plain

 

 

 

 

 

 

もっとフェードインフェードアウトを使いやすくする

先ほどのFadeコルーチンのサマリーにアルファ(透明度)を1から0にとありますが、
引数の値によっては0から1にすることもできます。

OVRScreenFadeにコードを追加してみます

FadeOn()メソッドを追加しました。
これは最初と最後のアルファ値とディレイ値を取りオーバーロードされたFadeコルーチンを呼び出します。
Fadeコルーチンはディレイ値を元に遅延実行します。書いてる途中で思ったけどこれDelay必要ない

 

 

 

テスト用に以下のスクリプトを作成しました。

1秒後にフェードインがかかり、5秒後にフェードアウトがかかります。
このような形でFadeOnメソッドを呼び出せば簡単にシーン遷移時のフェード効果をつけることができます。

f:id:Raspberly:20190721114647g:plain

 

 

 

 

 

最初からフェード(画面が覆われた)状態にしておく

fadeOnStartを使わず手動でフェードインをする場合はSetFadeLevelで初期化する必要があります。
実はOnEnabledとAwakeで初期化処理が走っているのでここに少し手を加えます。

 

SetFadeLevel(1)を呼び出しておくことで、シーン開始に画面が覆われた状態から始めることができます。

f:id:Raspberly:20190721130100g:plain

 

 

 

 

まとめ

フェードをつけたい場合はOVRScreenFadeをCenterEyeAnchorにつける

フェードインは自動でやってくれるが、フェードアウトは別途スクリプトを書いて呼ばないといけない

OVRScreenFadeにちょっと手を加えてフェードインも手動で行うことができる

 

 

 

 

参考文献

UnityにおけるuGUIを使った画面切り替えの解説

tsubakit1.hateblo.jp

 

 

公式リファレンス
https://developer.oculus.com/reference/unity/1.38/class_o_v_r_screen_fade

 

 

 

 

他間違っている箇所がありましたらコメントにお願いします。