Other/Unity

[Unity] AsyncOperation 비동기적 코루틴을 이용한 Load Scene과 Progress 만들기

개발왕 금골드 2020. 2. 14. 20:11
반응형

안녕하세요 골드입니다.

오늘은 AsyncOperation을 사용하여

Scene을 넘어갈때 Progress를 만드는 쉬운 방법에 대해서 소개하겠습니다.

 

비동기라는 말은 동시에 일어나지 않는다는 뜻입니다.

만약 Unity에서 LoadScene을 하면 해당 데이터를 동시에 가져오기 시작합니다. 

여기서 문제는 해당 데이터를 다 가져올때까지 사용자는 아무런 동작도 수행할 수 없습니다.

우리는 흔히 '렉' 이라고 말합니다.

유니티에서 제공하는 AsyncOperation으로 비동기적 코루틴을 실행하면

이러한 문제를 해결할 수 있습니다.

 

1. AsyncOperation

먼저 변수들을 살펴보겠습니다.

allowSceneActivation 장면이 준비된 즉시 장면이 활성화되는 것을 허용합니다.
isDone 해당 동작이 완료되었는지를 나타냅니다. (읽기전용)
priority Priority는 동작할 비동기적인 작업 요청 순서를 수정할 수 있도록 해줍니다.
progress 작업의 진행상태를 나타냅니다. (읽기전용)

출처 : https://docs.unity3d.com/kr/530/ScriptReference/AsyncOperation.html

 

Unity - 스크립팅 API: AsyncOperation

AsyncOperation class in UnityEngine / Inherits from:YieldInstruction Switch to Manual Description 비동기적으로 코루틴(coroutine)을 수행합니다. 비동기직인 수행이 이어지기 전까지, yield기능을 사용할 수 있고, (isDone) ��

docs.unity3d.com

 

Coroutine으로 비동기적  수행이 이어지기 전까지 yield할 수 있고(잠시 멈추거나 등등),

변수들 중 isDone 혹은 progress를 사용하면 진행이 완료되었는지 수동으로 확인할 수 있습니다.

 

2. LoadSceneAsync 활용하기 

먼저 간단한 로그인 화면을 만들겠습니다.

로그인 화면에서 id와 password를 입력하는 부분을 TMP_InputField로 만들고

그 옆에 버튼을 하나 생성하겠습니다.

 

그리고 스크립트를 만듭니다. 저는 Login이라고 짓겠습니다.

InputField와 Button을 참조하기 위해 스크립트를 작성합니다.

여기에서는 Text Mesh Pro UGUI로 만들었습니다.

사용하기 위해서는 상단에 using TMPro를 선언해야 합니다.

Login script를 게임 오브젝트에 컴포넌트로 붙인 후

해당 컴포넌트들을 참조하도록 합니다.

 

스크립트를 열고 using UnityEngine.SceneManagement를 작성합니다.

SceneManagement에는 Scene에 대한 메서드들이 작성되어 있습니다.

Scene에 대한 정보를 get할 수도 있고,

특히 LoadScene을 사용해서 다른 scene으로 넘어가거나 할 수 있습니다.

 

 

Start()에서 버튼 리스너를 추가합니다.

(혹은 버튼 컴포넌트에 있는 OnClick()도 사용 가능합니다.)

코루틴 함수를 작성합니다.

LoadSceneAsync는 yield를 구현해야 하기 때문에 반드시 코루틴 안에서 선언해야 합니다.

앞서 설명한 변수들이 보입니다.

먼저 로드할 씬의 이름을 대소문자 구분하여 작성하고,

씬을 로드할때 LoadScene이 아닌 LoadSceneAsync로 로드합니다.

while 문에서 처리가 완료될때까지(씬이 생성되기까지) 반복하도록 선언해주었고,

진행상황을 Text로 보여줍니다.

 

이제 플레이 해보겠습니다.

 

아이디 : hihi 비밀번호 : 1111

 

콘솔 창에 로그가 찍히는 것을 볼 수 있습니다.

 

 

-------------------------------------------------------------------------

 + 추가

 

추가로 allowSceneActivation을 활용하여,

모든 준비가 끝났을 때 스페이스 바를 누르면 다음으로 넘어가도록 만들 수 있습니다.

 

다시 아까 만든 LoadScene 코루틴으로 돌아갑니다.

핸드폰 게임을 하다보면(혹은 컴퓨터, 콘솔 게임들도) 탭을 하여 다음으로 넘어가라는 문구를 볼 수 있습니다. 자주 사용하는 기능이라 유니티에서 제공해준 것 같습니다.

if문 안에 있는 코드를 사용하면 탭하여 다음으로 넘어가기를 쉽게 구현할 수 있습니다.

 

저는 Unity 공식 API 문서를 참고하여 작성하였습니다.

자세한 내용은 공식 API 문서에서 확인이 가능합니다.

 

여기까지 골드였습니다.

감사합니다.

 

참고자료 : https://docs.unity3d.com/ScriptReference/AsyncOperation-allowSceneActivation.html
https://m.blog.naver.com/pxkey/221307916592

 

Unity - Scripting API: AsyncOperation.allowSceneActivation

 

docs.unity3d.com

 

반응형