VR SupportされてるUnity 5.xでOculusのフェードイン、フェードアウト


VR SupportされてるUnity 5.xでOculusのフェードイン、フェードアウト

使用環境 : Unity 5.3.2f1

趣味でUnityでVRしてます。
Oculusでシーンの移動でフェードイン、フェードアウトしたいのですが、調べてもOVRなんとかを使った古いものばかりで、VR Supportのチェックを入れてお手軽に遊んでる私にとってはコンパイルエラーです。

なので、忘備録もかねてシーンをフェードするスクリプトです。

1. 使い方

Main Cameraにスクリプトを入れます。
シーンが呼ばれた時(Main Cameraがenableになったとき)フェードインします。

違うシーンに移動する時は

Camera.main.GetComponent<SceenFade>().LoadSceenWithFade("Sceen1");

こんな感じでシーンを呼び出すと、フェードアウト後、シーンをロードします。
(なので、呼び出すシーンのMain Cameraにこのスクリプトを入れるとフェードアウト後、シーンをロードしてフェードインします)

うん、メインカメラに入れるので、Findしなくて良いのでらくちん

2. スクリプト

using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;

public class SceenFade : MonoBehaviour {

    public float fadeTime = 2.0f;
    public Color fadeColor = new Color(0.01f, 0.01f, 0.01f, 1.0f);
    public Shader fadeShader = null;

    private Material fadeMaterial = null;
    private bool isFading = false;

    void Awake()
    {
        fadeMaterial = (fadeShader != null) ? new Material(fadeShader) : new Material(Shader.Find("Transparent/Diffuse"));
    }

    void OnEnable()
    {
        StartCoroutine(FadeIn());
    }

    public void LoadSceenWithFade(string sceenname)
    {
        StartCoroutine(FadeOut(sceenname));
    }

    void OnDestroy()
    {
        if (fadeMaterial != null)
        {
            Destroy(fadeMaterial);
        }
    }

    IEnumerator FadeIn()
    {
        float elapsedTime = 0.0f;
        Color color = fadeMaterial.color = fadeColor;
        isFading = true;
        while (elapsedTime < fadeTime)
        {
            yield return new WaitForEndOfFrame();
            elapsedTime += Time.deltaTime;
            color.a = 1.0f - Mathf.Clamp01(elapsedTime / fadeTime);
            fadeMaterial.color = color;
        }
        isFading = false;
    }

    IEnumerator FadeOut(string sceen)
    {
        float elapsedTime = 0.0f;
        fadeColor.a = 0f;
        Color color = fadeMaterial.color = fadeColor;
        isFading = true;
        while (elapsedTime < fadeTime)
        {
            yield return new WaitForEndOfFrame();
            elapsedTime += Time.deltaTime;
            color.a = 0.0f + Mathf.Clamp01(elapsedTime / fadeTime);
            fadeMaterial.color = color;
        }
        SceneManager.LoadScene(sceen);
        isFading = false;
    }

    void OnPostRender()
    {
        if (isFading)
        {
            fadeMaterial.SetPass(0);
            GL.PushMatrix();
            GL.LoadOrtho();
            GL.Color(fadeMaterial.color);
            GL.Begin(GL.QUADS);
            GL.Vertex3(0f, 0f, -12f);
            GL.Vertex3(0f, 1f, -12f);
            GL.Vertex3(1f, 1f, -12f);
            GL.Vertex3(1f, 0f, -12f);
            GL.End();
            GL.PopMatrix();
        }
    }
}

3. Shader.Findの注意点

スクリプト内でShader.Findを使ってますが、Unity Editorとビルド後では動作が異なるので注意してください。

Unity Editor → Build-in Shaderも問題なく検索してくれる
ビルド後の環境 → HierarchyにあるShaderのみ檢索

なので、Editor上では問題ありませんがビルド環境ではHierarchy内に【Transparent/Diffuse】のシェーダを使ったマテリアルがアタッチされてるObujectがないと動きませんので注意です。