SteamVRにおいて「待」を表示させずに次のシーンをロードする方法

【注意】まだ十分に調査できていません。取り敢えず分かった範囲で書いています。何かありましたらTwitterやコメントなどで教えてください。またこの記事は2017/6/19時点のSteamVRベータ版を使用して検証しました(Homeアプリがベータとして配布され始めたころのバージョンです)。

SteamVRにおけるシーンの読み込み

SteamVRパッケージ付属のSteamVR_LoadLevel#Begin()を使って次のシーンを読み込んでいるかと思いますが、そこのコードを読む読むと以下のように書かれています。

	// Helper function to quickly and simply load a level from script.
	public static void Begin(string levelName,
		bool showGrid = false, float fadeOutTime = 0.5f,
		float r = 0.0f, float g = 0.0f, float b = 0.0f, float a = 1.0f)
	{
		var loader = new GameObject("loader").AddComponent<SteamVR_LoadLevel>();
		loader.levelName = levelName;
		loader.showGrid = showGrid;
		loader.fadeOutTime = fadeOutTime;
		loader.backgroundColor = new Color(r, g, b, a);
		loader.Trigger();
	}

よく読むと分りますが、SteamVR_LoadLevelコンポーネントを追加して、次の読み込むシーン名(.levelName)の設定、グリッドの表示(.showGrid)、フェードアウト時間(.fadeOutTime)、背景色(.backgroundColor)をセットしてTrigger()メソッドを呼んでいます。

実はこのクラスにもっとたくさんのパラメータがあり、それぞれの組み合わせによってロード中の表示を変えることができます。

ロード中の背景を変える

背景画像をFront, Back, Left, Right, Top, Bottomに6 sidedのsky box用画像をセットします。

この時注意する点として画像が圧縮されていてはいけないことです。下の図の様に画像ファイルを選択してInspectorウィンドウのCompressionを「None」に変更して[Apply]ボタンを押してください。

プログレスバーを表示する

まずプログレスバーとして使用する画像ファイルを用意します。ここでは1024 x 64ピクセルの2つの画像を用意しました(白色の画像ファイルなので見えないと思いますが……)。

これをProgress Bar EmptyとProgress Bar Fullにそれぞれセットします。さらにLoading Screen Width In Meters、Progress Bar Width In Meters、Loading Screen Distanceを以下のように設定します(好みで変更しても構いませんが、Loading Screen Distanceは0より大きな値にセットするのが良いです)。

あと、Loading Screenには適当な画像をセットしてください(表示はされないけど(理由不明))。これをセットしないと目の前にプログレスバーを表示せずに違うところに表示されてしまいます。

Loading Scene TransformやProgress Bar Transformをセットするとそれなりに動くはずなんですが、私はうまく制御できませんでした(期待通りの動作をしないという意味。まだ調査が足りていません)。

これでシーンのロードに合わせて白い色から青い色にバーが埋まっていく様子が前方5m先に表示されるはずです。

任意の画像を表示する

先ほどのProgress Bar EmptyおよびProgress Bar Fullに適当なサイズの同じ画像を張り付けます。配布したバイナリではユニティちゃんの画像を張り付けていました。同じ画像を張り付けることでシーンのローディング中は同じ画像を表示することができます。

シーンの読み込みスクリプト

これらの情報をセットして、SteamVR_LoadLevel#Trigger()を呼び出せば任意の画像と背景を表示しながらシーンの読み込みができます。

以下はサンプルコードです。空のゲームオブジェクトを作成してSteamVR_LoadLevel.csをアタッチし、さらにこのスクリプトをアタッチして使用してください。このスクリーンをアタッチしたら、読み込みたいシーン名だけセットするとよいでしょう。これはあくまでもサンプルなので適当に修正して使用してください。

 

using UnityEngine;

public class LoadLevel : MonoBehaviour {

    SteamVR_LoadLevel ll;
    public string levelName;

	// Use this for initialization
	void Start () {
        ll = GetComponent<SteamVR_LoadLevel>();	
	}
	
	// Update is called once per frame
	void Update () {
	    if (Input.GetKeyDown(KeyCode.Space))
        {
            ll.levelName = levelName;
            ll.Trigger();
        }	
	}
}

 

実行例

未調査項目

・別のVRアプリを呼び出せる?(Internal Process PathとInternal Process Argsがそうじゃないかと睨んでいる)
・Loading Screen、Loading Scene Transform、Progress Bar Transformを上手く制御できない
・Fade Out Time、Fade In Time、Post Load Settle Time(シーンの読み込みが終わってもローディング中の画像を維持する時間)、Loading Screen Fade In Time、Loading Screen Fade Out Timeなどは整理しきれていない

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です