VRコンテンツのスプラッシュシーンを作る

ゲームとかだと最初にスプラッシュシーンが入って本編が始まる。VRコンテンツの場合平面の状態がないので空間にCanvasを浮かべる感じにした。

## 空間を球体で囲む

まずは `3D Object` -> `Sphere` とかで雑に囲んでしまう。サイズがやや小さい感じになるのでscaleはxyz各100とかに。

![Screen Shot 2016-06-09 at 18.23.48.png](https://qiita-image-store.s3.amazonaws.com/0/15618/6c8dce44-b99a-6dba-cc49-014b575b2211.png "Screen Shot 2016-06-09 at 18.23.48.png")

## マテリアルの設定

配置した球体に適用するマテリアルを用意。今回は一面真っ白な環境を作ることにしとく。

![Screen Shot 2016-06-09 at 18.30.06.png](https://qiita-image-store.s3.amazonaws.com/0/15618/5e9a6544-4bf6-0f0f-61c0-7cbeb821186c.png "Screen Shot 2016-06-09 at 18.30.06.png")

![Screen Shot 2016-06-09 at 18.33.50.png](https://qiita-image-store.s3.amazonaws.com/0/15618/4acec53d-e5d3-7d65-e248-5901e9545246.png "Screen Shot 2016-06-09 at 18.33.50.png")

特に凝ったものにする必要もないので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
        }
    }
}
```

![Screen Shot 2016-06-09 at 18.41.56.png](https://qiita-image-store.s3.amazonaws.com/0/15618/744cca73-1d9d-16a3-21ac-8a0b3e56ba9e.png "Screen Shot 2016-06-09 at 18.41.56.png")

モデルをいじれるならメッシュの向きを変えてしまえばカリングとか不要。

## イメージ配置

スプラッシュで表示したいイメージを置く。シーンにImage置いてCanvasのRenderModeを`WorldSpace`にした上で位置調整。必要なスプラッシュイメージの取り込み。画像は拾ってきたので適当。

![Screen Shot 2016-06-09 at 19.00.20.png](https://qiita-image-store.s3.amazonaws.com/0/15618/0e51ad2f-5179-c622-7e81-b5d2f97d4678.png "Screen Shot 2016-06-09 at 19.00.20.png")

![Screen Shot 2016-06-09 at 19.00.36.png](https://qiita-image-store.s3.amazonaws.com/0/15618/680fcccc-2bed-5901-eac0-66cb4580b33c.png "Screen Shot 2016-06-09 at 19.00.36.png")

いい感じに動作するようにスクリプトこしらえてそのへんのオブジェクトにアタッチ。

```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;
    }
}
```

![Screen Shot 2016-06-09 at 19.08.34.png](https://qiita-image-store.s3.amazonaws.com/0/15618/5e584fa2-05eb-4515-3954-34de5c418281.png "Screen Shot 2016-06-09 at 19.08.34.png")

## 動作

![splashsample.gif](https://qiita-image-store.s3.amazonaws.com/0/15618/a0babeef-1e03-9b53-b343-479655092fae.gif "splashsample.gif")

Oculusのガイドラインとかだと背景は黒の方がいいとか書いてた気もする。