ゲームとかだと最初にスプラッシュシーンが入って本編が始まる。VRコンテンツの場合平面の状態がないので空間にCanvasを浮かべる感じにした。
空間を球体で囲む
まずは 3D Object
-> Sphere
とかで雑に囲んでしまう。サイズがやや小さい感じになるのでscaleはxyz各100とかに。
マテリアルの設定
配置した球体に適用するマテリアルを用意。今回は一面真っ白な環境を作ることにしとく。
特に凝ったものにする必要もないのでShaderは一旦Unlit/Color
の255,255,255。SphereのMesh自体が外向きなので、Cameraを球体内に配置すると裏側から見る感じになってだめなやつになる。なので描画する面を変えてしまう。
http://forum.unity3d.com/threads/unlit-single-color-shader.180833/ のレスからそのまま拝借&改良。
Shader "Custom/UnlitCullingFront" {
Properties {
_Color ("Color", COLOR) = (1,1,1,1)
}
SubShader {
Color [_Color]
Pass {
Cull Front
}
}
}
モデルをいじれるならメッシュの向きを変えてしまえばカリングとか不要。
イメージ配置
スプラッシュで表示したいイメージを置く。シーンにImage置いてCanvasのRenderModeをWorldSpace
にした上で位置調整。必要なスプラッシュイメージの取り込み。画像は拾ってきたので適当。
いい感じに動作するようにスクリプトこしらえてそのへんのオブジェクトにアタッチ。
SplashImage.cs
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System.Collections;
public class SplashImage : MonoBehaviour
{
[SerializeField]
Image Image;
[SerializeField]
Sprite[] Images;
[SerializeField]
float FadeSpeed = 0.01f;
[SerializeField]
float DisplayTime = 1f;
[SerializeField]
string NextSceneName;
AsyncOperation ao;
// Use this for initialization
void Start ()
{
this.ao = SceneManager.LoadSceneAsync(NextSceneName);
this.ao.allowSceneActivation = false;
StartCoroutine(Fade());
}
IEnumerator Fade()
{
foreach (var img in this.Images)
{
this.Image.sprite = img;
Color currentColor = new Color(1, 1, 1, 0);
while (currentColor.a < 1)
{
currentColor.a += FadeSpeed;
this.Image.color = currentColor;
yield return new WaitForEndOfFrame();
}
yield return new WaitForSeconds(DisplayTime);
while (currentColor.a > 0)
{
currentColor.a -= FadeSpeed;
this.Image.color = currentColor;
yield return new WaitForEndOfFrame();
}
}
this.ao.allowSceneActivation = true;
}
}
動作
Oculusのガイドラインとかだと背景は黒の方がいいとか書いてた気もする。