예제 #1
0
    /// <summary>
    /// 遷移開始
    /// </summary>
    /// <param name="name"></param>
    /// <returns></returns>
    IEnumerator SceneActiveChange(SceneState name)
    {
        LaserPointer laserObj;          // レーザポインターを消したりつけたりするために使用

        // 2重に通らないようにフラグを立てておく
        changeNowFlg = true;

        // フェードアウトするまで先へは進めない
        yield return(StartCoroutine(fade.FadeOut()));

        // チュートリアルまたはゲームメインから変わるときにカメラの座標を引き継ぐためのスクリプト
        if (sceneStateOld == SceneState.Tutorial || sceneStateOld == SceneState.GameMain)
        {
            Transform otherCameraTransform;
            // 超危険な取り方をしております
            // エミュ上
            if (CameraHeadObj.activeSelf)
            {
                otherCameraTransform             = GameObject.Find("Camera (head)").transform;
                CameraHeadObj.transform.position = otherCameraTransform.position;
                CameraHeadObj.transform.rotation = otherCameraTransform.rotation;
            }

            // VR上
            else if (CameraEyeObj.activeSelf)
            {
                otherCameraTransform            = GameObject.Find("Camera (eye)").transform;
                CameraEyeObj.transform.position = otherCameraTransform.position;
                CameraEyeObj.transform.rotation = otherCameraTransform.rotation;
            }
        }

        // sceneに入っている無駄なものをすべて削除する
        foreach (GameObject g in GameObject.FindObjectsOfType <GameObject>())
        {
            if (g.transform.root.gameObject.tag != "SceneManager")
            {
                Destroy(g.transform.root.gameObject);
            }
        }

        // 一応残しておく

        /*// もし右手にレーザーがついてたら削除する
         * laserObj = GameObject.Find("RightController").GetComponent<LaserPointer>();
         * if (laserObj) {
         *      laserObj.DestroyPrefab();
         * }
         *
         * // もし左手にレーザーがついてたら削除する
         * laserObj = GameObject.Find("LeftContorller").GetComponent<LaserPointer>();
         * if (laserObj) {
         *      laserObj.DestroyPrefab();
         * }
         */
        CameraChange(true);

        // 不要になったシーンを削除する
        for (int sequence = 0; sequence < SceneState.MaxScene.GetHashCode(); sequence++)
        {
            if (sceneFlg[sequence] == true)
            {
                SceneManager.UnloadSceneAsync(sceneName[sequence]);
                sceneFlg[sequence] = false;
            }
        }

        if (name != SceneState.Result)
        {
            GameCount.CountReset();
        }

        yield return(new WaitForEndOfFrame());

        // タイトル、リザルト、ステージセレクトへ遷移する場合はカメラを切り替えてレーザーの作成を行います
        if (name == SceneState.Title || name == SceneState.Result || name == SceneState.StageSelect)
        {
            // アクティブシーンの切り替え
            SceneManager.SetActiveScene(SceneManager.GetSceneByName("SceneManager"));

            // 一応残しておく

            /*// もし左手にレーザーがついてたら作成する
             * laserObj = GameObject.Find("RightController").GetComponent<LaserPointer>();
             * if (laserObj) {
             *      laserObj.CreatPrefab();
             * }
             *
             * // もし左手にレーザーがついてたら作成する
             * laserObj = GameObject.Find("LeftContorller").GetComponent<LaserPointer>();
             * if (laserObj) {
             *      laserObj.CreatPrefab();
             * }*/
        }

        // シーンの追加
        AsyncOperation async = SceneManager.LoadSceneAsync(sceneName[name.GetHashCode()], LoadSceneMode.Additive);

        while (true)
        {
            if (async.isDone == true)
            {
                break;
            }
            yield return(null);
        }

        effectCanvasObj.worldCamera = GameObject.Find("Camera (eye)").GetComponent <Camera>();

        // アクティブシーンの切り替え
        SceneManager.SetActiveScene(SceneManager.GetSceneByName(sceneName[name.GetHashCode()]));

        // フェードインするまで先へ進めないよ
        yield return(StartCoroutine(fade.FadeIn()));

        sceneFlg[name.GetHashCode()] = true;

        changeNowFlg  = false;
        sceneStateOld = name;
    }