김김김의 게임개발
  • 유니티 게임개발 - 최종 프로젝트 #4
    2023년 10월 26일 21시 48분 46초에 업로드 된 글입니다.
    작성자: noun06

    메인메뉴, 로비, 인게임 씬을 유동적으로 관리하는 씬매니저를 제작하였다.

    우선 열거형으로 게임 내 사용할 여러 씬을 정의하였다.

    Scene 열거형을 인수로 받아 씬을 비동기로 로드하는 LoadSceneAsync메서드를 코루틴으로 호출한다.

    LoadSceneAsync 메서드는 비동기로 씬을 로드하고 로딩바 창을 표시하는 역할을 한다.

    private IEnumerator LoadSceneAsync(string sceneName)
        {
            progressSlider.value = 0;
            loaderUI.SetActive(true);
    
            AsyncOperation asyncOperation = SceneManager.LoadSceneAsync(sceneName);
            asyncOperation.allowSceneActivation = false;
    
            float progress = 0;
            while (!asyncOperation.isDone)
            {
                progress = Mathf.MoveTowards(progress, asyncOperation.progress, Time.deltaTime);
                progressSlider.value = progress;
    
                if (progress >= 0.9f)
                {
                    progressSlider.value = 1;
                    asyncOperation.allowSceneActivation = true;
                }
    
                yield return null;
            }
        }

     

    AsyncOperation은 유니티에서 비동기 작업을 처리하는 데 사용되는 클래스이다.

    주로 씬 로딩, 에셋 번들 로딩, 데이터 다운로드 등 실행시간이 있는 작업을 수행할 때 사용된다고 한다.

    주로 SceneManager.LoadSceneAsync() 메서드와 함께 사용되어 로드하는 객체를 반환한다.

    나는 비동기 루프 방식으로 코루틴 반환을 통해 작업을 추적하고 화면을 업데이트하였다.

    처음에는 단순하게 UX적인 측면에서 사용자에게 씬 전환을 인지시키려는 용도로 기능을 추가하고 싶었다.

    하지만 그 부분과 더불어 비동기 작업을 통해 게임의 성능을 향상시키는데 큰 이점이 있다고 느꼈다.

    댓글