상세 컨텐츠

본문 제목

1126 TIL - 최종 프로젝트 시작, 로딩 씬 구현

카테고리 없음

by lucar 2024. 11. 26. 21:10

본문

스파르타 부트캠프도 이제 마지막 프로젝트가 시작이다.

 

마지막으로 제작할 팀 프로젝트는

방치형 액션 RPG인데

컨셉을 좀 기깔나게 잡았다.

소울이라는 오브젝트를 두고

이를 편성해서 캐릭터의 성격이나 전투방식을 모두 덮어씌우는 빙의라는 메인 시스템으로 진행한다.

 

자세한 건 나중에 만들어지고 나서

 

어쨌든 오늘은 로딩화면을 만들어보자.

 

그 어느 게임을 가도 로딩화면 없는 게임은 찾기 힘들 것이다.

로딩화면의 존재 이유는 당연히 다음 씬의 리소스를 미리 불러오기 위해서이고

 

그렇다면 로딩화면을 불러옴과 동시에 다음 씬의 리소스 작업이 진행되어야 하고

완료되자마자 다음 씬이 보여져야한다.

 

저번에 코루틴이 비동기식으로 작동한다고 작성한 글이 있었던가 잘 기억이 나진 않지만

 

동기식과 비동기식이라는 관점에서 바라보면

 

간단하게 말해서 동기식은 하나의 프로세스가 완료되는 시점에서 다른 프로세스가 진행이 되고

비동기식은 여러가지의 프로세스가 동시에 진행될 수도 있지만

다른 프로세스와의 연관성은 없다고 생각하면 된다.

로딩화면은 리소스 로드가 완료되면 응답을 받고 다음 프로세스로 진행되는 동기화 식이다.

 

코드는 다음과 같다.

 

public class LoadingScene : MonoBehaviour
{
    private static string nextScene;
    private readonly WaitForSeconds wait1s = new WaitForSeconds(1);

    private void Awake()
    {
        StartCoroutine(CoLoading()); //로딩씬이 불러와지면 CoLoading 코루틴을 실행
    }

    IEnumerator CoLoading()
    {
        yield return null;
        AsyncOperation loading = SceneManager.LoadSceneAsync(nextScene); //동기화 작업 설정
        loading.allowSceneActivation = false; //씬을 움직이지 않는다.
        while (!loading.isDone) //로딩하는 동안
        {
            yield return null;
            if (loading.progress >= 0.9f)
            {
                yield return wait1s;
                loading.allowSceneActivation = true; //씬을 이동한다.
                yield break;
            }
        }
    }
}

 

왜 loading.progress를 1.0 이상 일때 넘기지 않고 0.9 이상이라면 씬을 이동하는 걸까?

 

loading.progress를 디버그 해보자.

IEnumerator CoLoading()
    {
        yield return null;
        AsyncOperation loading = SceneManager.LoadSceneAsync(nextScene);
        loading.allowSceneActivation = false;
        while (!loading.isDone)
        {
            yield return null;
            Debug.Log(loading.progress); //디버그
            if (loading.progress >= 1.0f) //0이상으로 수정
            {
                yield return wait1s;
                loading.allowSceneActivation = true;
                yield break;
            }
        }
    }

실행해보자.

0.9만 계속 찍힌다

 

0.9일때  loading.allowSceneActivation을 true로 설정해주면 칼같이 넘어가는 것을 볼 수 있다.

 

간단한 UI를 만들고 연결해준 뒤에 실행해보자.

 

public class LoadingScene : MonoBehaviour
{
    private static string nextScene;
    public Slider gauge;
    public TextMeshProUGUI percent;
    private readonly WaitForSeconds wait1s = new WaitForSeconds(1);

    private void Awake()
    {
        nextScene = SceneDataManager.Instance.NextScene;
        StartCoroutine(CoLoading());
    }

    public void LoadScene(string sceneName)
    {
        nextScene = sceneName;
        SceneManager.LoadScene("LoadingScene");
    }

    IEnumerator CoLoading()
    {
        yield return null;
        AsyncOperation loading = SceneManager.LoadSceneAsync(nextScene);
        loading.allowSceneActivation = true;
        while (!loading.isDone)
        {
            yield return null;
            gauge.value = loading.progress;
            percent.text = (gauge.value * 100).ToString() + " %";
            if (loading.isDone)
            {
                Debug.Log("완료!");
            }
            if (loading.progress >= 0.9f)
            {
                gauge.value = 1f;
                percent.text = "Load Complete!";
                yield return wait1s;
                loading.allowSceneActivation = true;
                yield break;
            }
        }
    }
}

 

실행해보면?

생각해보니 불러올 화면도 이거라서 리소스가 뭐가 없어서 로딩이 순식간에 끝나버린다.

 

그래도 잘 작동되는걸 확인했다

 

TTE