{TIL} Unity 씬 전환 딜레이

Kwaksang·2024년 5월 21일

TIL

목록 보기
25/37
post-thumbnail

Unity 씬 전환 딜레이 생성 방법

Chapter .1 Unity 씬 전환 딜레이 생성

Content .1 생성 이유

  • 씬 전환 시 효과음이 잘리는 현상 개선을 위해
  • 보다 자연스러운 연출을 위해

Content .2 생성 방법

  1. Invoke 활용 방법
  2. Corutine 활용 방법

Content .3 Invoke 코드 사용 시

public class SceneChange : MonoBehaviour
{
	Invoke("load_B_Scene",1.0f);
    Invoke("load_C_Scene",1.0f);
    
    public void SceneChangeBtn()
    {
    	if (SceneManager.sceneCountInBuildSetting == 0)
    		SceneManager.LoadScene("B_Scene");

		else if (SceneManager.sceneCountInBuildSetting == 1)
            SceneManager.LoadScene("C_Scene");
    }
}

아직 Invoke 활용이 익숙하지 않아, 2가지 씬으로 각각 이동하는 방법을 구상하지 못하였고
메서드를 어떻게 분리해야 할지 몰라서 포기하게 되었습니다.

Content .4 Corutine 사용 시

public class SceneChange : MonoBehaviour
{
    public void SceneChangeBtn()
    {
        if (SceneManager.sceneCountInBuildSetting == 0)
            StartCoroutine(load_B_Scene());
        
        else if (SceneManager.sceneCountInBuildSetting == 1)
            StartCoroutine(load_C_Scene());
    }

    IEnumerator load_B_Scene()
    {
        yield return new WaitForSeconds(1.0f);
        SceneManager.LoadScene("B_Scene");
    }

    IEnumerator load_C_Scene()
    {
        yield return new WaitForSeconds(1.0f);
        SceneManager.LoadScene("C_Scene");
    }
}

코루틴으로 작성을 했을 때에도 현재 씬을 제대로 인지하지 못하고
sceneCountInBuildSetting 값을 지우게 되면 코루틴이 멈추지 않아서
A씬에서 B씬으로 이동을 하지 않고 바로 C씬으로 이동이 되었습니다.

Chapter .2 해결 방법

Content .1 강사님이 안내해준 방법

  • Thread.Sleep(1000)을 통해 잠시 정지 후 화면 이동을 해보는 방법을 제안해주심

씬 이동 시 1초의 딜레이는 발생했지만, 효과음까지 함께 멈추게 되어 사용하지 못함

Content .2 현재 씬을 불러오는 값 변경

  • sceneCountInBuildSetting 은 단순히 빌드세팅 내의 씬의 숫자를 세어주는 용도
  • GetActiveScene() 가 활성화된 현재 씬을 확인할 수 있는 용도
  • buildIndex 를 통해 빌드세팅 내의 씬의 숫자를 이중 체크 가능

Content .3 씬 변경과 함께 코루틴 정지

  • 코루틴이 멈추지 않아 씬이 계속 넘어가는 문제를 막기 위해서 씬 변경 후 바로 코루틴 정지
  • 이 방법으로 한 개의 스크립트로 여러 개의 씬을 막힘없이 딜레이를 주며 변경 가능
  • 효과음도 정상적으로 출력되는 모습을 확인
public class SceneChange : MonoBehaviour
{
	// 어떤 버튼인지 설정
    public void SceneChangeBtn()
    {
    	// 이 씬이 빌드 세팅 기준 0번 씬이라면
        if (SceneManager.GetActiveScene().buildIndex == 0)
        	// load_B_Scene 함수에서 코루틴을 시작해라
            StartCoroutine(load_B_Scene());
        
        // 이 씬이 빌드 세팅 기준 0번이 아니고 1번 씬이라면
        else if (SceneManager.GetActiveScene().buildIndex == 1)
        	// load_C_Scene 함수에서 코루틴을 시작해라
            StartCoroutine(load_C_Scene());
    }

	// load_B_Scene 설정
    IEnumerator load_B_Scene()
    {
    	// 코루틴 설정 값 : 다음 값만큼 기다려라 (1초)
        yield return new WaitForSeconds(1.0f);
        // B_Scene을 불러와라
        SceneManager.LoadScene("B_Scene");
        // load_B_Scene 코루틴을 정지해라
        StopCoroutine(load_B_Scene());
    }

    IEnumerator load_C_Scene()
    {
        yield return new WaitForSeconds(1.0f);
        SceneManager.LoadScene("C_Scene");
        StopCoroutine(load_C_Scene());
    }
}

Chapter .3 아쉬운 점

Invoke를 제대로 활용해보지 못해서 아쉬움
보다 더 간결하게 코드를 짜지 못한 부분이 아쉬움
고작 이런 문제로 3시간을 허비한 것이 정말 아쉬움

profile
게임은 재미와 기능!

0개의 댓글