Beispiel #1
0
        private IEnumerator Transition()
        {
            if (sceneToLoad < 0)
            {
                Debug.LogError("Scene to load not set.");
                yield break;
            }

            // 현재 오브젝트를 다른씬 로드할때 남겨놓음. destroy할 경우 밑에 코드들이 전부 날라감.
            DontDestroyOnLoad(gameObject);
            Fader         fader            = FindObjectOfType <Fader>();
            SavingWrapper savingWrapper    = FindObjectOfType <SavingWrapper>();
            var           playerController = GameObject.FindWithTag("Player").GetComponent <PlayerController>();

            playerController.enabled = false;
            // Remove control

            if (fader != null)
            {
                yield return(fader.FadeOut(m_FadeOutTime));
            }

            savingWrapper.Save();

            yield return(SceneManager.LoadSceneAsync(sceneToLoad));

            // Remove control form loaded player
            // 씬을 넘어왔으니 플레이어를 다시 찾아야한다.
            var newPlayerController = GameObject.FindWithTag("Player").GetComponent <PlayerController>();

            newPlayerController.enabled = false;

            savingWrapper.Load();

            Portal otherPortal = GetOtherPortal();

            UpdatePlayer(otherPortal);

            savingWrapper.Save();

            // 2번연속 충돌감지 방지하기위해 꺼놓은 충돌감지를 새로운 scene이로드 됬을때 다시 켜준다.
            GetComponent <Collider>().enabled = true;

            yield return(new WaitForSeconds(m_FadeWaitTime));

            // if (fader != null)
            // yield return fader.FadeIn(m_fadeInTime);
            // Fader에서 Coroutine이 아닌 IEnumerator를 return 할때 사용했음
            // yield return이 끝나기전까지 newPlayerController.enabled = true;를 하지못하기때문에
            // Fade하는동안 Player는 움직이지 못함.
            // Fade가 끝나지 않아도 플레이어를 움직이게 하기위해
            // FadeIn은 Coroutine 자체를 return 하게해서 다른 곳에서 Coroutine을 실행 할 수 있게한다.
            // FadeIn, Fadeout을 void로 하지않은 이유는 Coroutine을 return 하면 yield return도 사용가능하기 때문.
            if (fader != null)
            {
                fader.FadeIn(m_FadeInTime);
            }

            // Restore control
            // 해당 포털이 Destroy하기전에 빠르게 포탈을 계속 이동할경우
            // Player위치렉이 걸린다.
            // 로딩이 다 끝나고 안정될때까지 Player를 못움직이게해야함.
            newPlayerController.enabled = true;
            Destroy(gameObject);
        }
        IEnumerator FadeIn(float time)
        {
            Fader fader = FindObjectOfType <Fader>();

            yield return(fader.FadeIn(fadeInTime));
        }
Beispiel #3
0
 private void Awake()
 {
     _fader         = FindObjectOfType <Fader>();
     _savingWrapper = FindObjectOfType <SavingWrapper>();
 }