2. ??? : 문 열어~!! _ Title 씬 구성 [Unity 스터디]

수집가 루브도·2024년 9월 8일
1
post-custom-banner

유저들이 처음 만날 대문이 될 타이틀 씬을 구성합니다.

타이틀 씬에는 현재로써는 크게 세 가지 기능이 있습니다.

1) 애니메이션으로 제어되는 로고가 표시됩니다.
2) 로비 씬을 불러옵니다.
3) 로비 씬에 들어가기 전 로딩 과정이 슬라이더로 표시됩니다.


애니메이션 재생 시간에 맞춰 동작 수행하기

유니티에서 애니메이션이 끝나는 시점을 아는 방법은 여러 가지가 있습니다.
예제에서는 그 중 애니메이션 클립의 길이를 참조해 그만큼 기다리게 하는 코루틴을 구성했습니다.

public Animation Anim;
private IEnumerator AnimationEndActionCorutine()
{
	Anim.Play()
   yield return new WaitForSeconds(Anim.clip.length);
   // 이후 애니메이션이 끝난 뒤 할 동작
}

AsyncOperation 객체 다루기

유니티에서 다른 씬을 불러오기 위해서 단순히 SceneManager.LoadScene() 메서드를 사용할 수 있습니다. 그러나 이 메서드 역시 IDE로 참조를 타고 가보면 끝까지 내용을 확인할 수는 없으나 LoadSceneAsync 작업을 불러오는 것을 알 수 있습니다. 또한 매뉴얼에서도 해당 메서드가 즉시 완료되는 동작이 아니라 혼란이 야기되거나 frame stuttering이 발생할 수 있다고 SceneManager.LoadSceneAsync() 사용을 권장합니다.

해당 메소드는 AsyncOperation 객체를 반환하며 이를 통해 현재 씬 로딩 작업의 프로퍼티를 참조할 수 있습니다.
새로 알게 된 사실 중 하나로, allowSceneActivation 값이 false일 때는 progress가 0.9일 때 멈춘 상태로 대기하고 true일 때는 자동으로 넘어가게 합니다. 그동안 씬 로딩이 끝났을 때 무언가 작업하려고 하는 게 어려웠던 적이 있었는데 이미 매뉴얼은 다 알려주고 있었다니...
매뉴얼의 씬 로딩 상태를 %로 나타내고 스페이스 키를 눌렀을 때 씬이 전환되도록 하는 코드까지 친절히 존재했었던...

public class AsyncOperationProgressExample : MonoBehaviour
{
  public Text m_Text;

public Button m_Button;

   void Start()
   {
       //Call the LoadButton() function when the user clicks this Button
       m_Button.onClick.AddListener(LoadButton);
   }

   void LoadButton()
   {
       //Start loading the Scene asynchronously and output the progress bar
       StartCoroutine(LoadScene());
   }

   IEnumerator LoadScene()
   {
       yield return null;

       //Begin to load the Scene you specify
       AsyncOperation asyncOperation = SceneManager.LoadSceneAsync("Scene3");
       
       //Don't let the Scene activate until you allow it to
       asyncOperation.allowSceneActivation = false;
      
       //When the load is still in progress, output the Text and progress bar
       while (!asyncOperation.isDone)
       {
           //Output the current progress
           m_Text.text = "Loading progress: " + (asyncOperation.progress * 100) + "%";

           // Check if the load has finished
           if (asyncOperation.progress >= 0.9f)
           {
               //Change the Text to show the Scene is ready
               m_Text.text = "Press the space bar to continue";
               //Wait to you press the space key to activate the Scene
               if (Input.GetKeyDown(KeyCode.Space))
                   //Activate the Scene
                   asyncOperation.allowSceneActivation = true;
           }

           yield return null;
       }
   }
}

슬라이더로 로딩 과정 표시하기

위의 매뉴얼 예제 코드에서 텍스트 표시할 때 사용한 asyncOperation.progress 를 Slider 컴포넌트의 value로 주면 됩니다.
예제에서는 일부러 50% 정도에서 로딩 바 표시를 시작하는 의도에 대해서도 이야기가 나왔습니다.
용도와 니즈에 따라 다를 것 같은데 확실히 로딩 화면을 어떻게 구성할 것인가 어떻게 하면 덜 지루할 것인가는 꽤 큰 과제인 것 같습니다.
시간이 좀 지난 자료지만 관련해서 유의미한 내용이 있다고 생각해서 로딩바에 대해 작성된 블로그 글을 같이 공유하며 마무리 합니다.

profile
다양하게 보고 배워 내 것으로 스케치하기
post-custom-banner

1개의 댓글

comment-user-thumbnail
2024년 9월 10일

Progress Bar와 관련된 자료가 있었군요. 흥미롭게 잘 읽었습니당.

답글 달기