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)); }
private void Awake() { _fader = FindObjectOfType <Fader>(); _savingWrapper = FindObjectOfType <SavingWrapper>(); }