유저들이 처음 만날 대문이 될 타이틀 씬을 구성합니다.
타이틀 씬에는 현재로써는 크게 세 가지 기능이 있습니다.
1) 애니메이션으로 제어되는 로고가 표시됩니다.
2) 로비 씬을 불러옵니다.
3) 로비 씬에 들어가기 전 로딩 과정이 슬라이더로 표시됩니다.
유니티에서 애니메이션이 끝나는 시점을 아는 방법은 여러 가지가 있습니다.
예제에서는 그 중 애니메이션 클립의 길이를 참조해 그만큼 기다리게 하는 코루틴을 구성했습니다.
public Animation Anim; private IEnumerator AnimationEndActionCorutine() { Anim.Play() yield return new WaitForSeconds(Anim.clip.length); // 이후 애니메이션이 끝난 뒤 할 동작 }
유니티에서 다른 씬을 불러오기 위해서 단순히 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% 정도에서 로딩 바 표시를 시작하는 의도에 대해서도 이야기가 나왔습니다.
용도와 니즈에 따라 다를 것 같은데 확실히 로딩 화면을 어떻게 구성할 것인가 어떻게 하면 덜 지루할 것인가는 꽤 큰 과제인 것 같습니다.
시간이 좀 지난 자료지만 관련해서 유의미한 내용이 있다고 생각해서 로딩바에 대해 작성된 블로그 글을 같이 공유하며 마무리 합니다.
Progress Bar와 관련된 자료가 있었군요. 흥미롭게 잘 읽었습니당.