본문 바로가기
KDT/유니티 심화

23/08/30 HeroShooter 타이틀 (비동기 씬 전환)

by 잰쟁 2023. 8. 30.
728x90

**비동기로 씬을 로딩하는 이유
: 동기로 씬을 가져올 경우 한 장면에 있는 모든 정보들을 불러오기 때문에 시간이 길어져서 사용자에게 불쾌한 경험을 줄 수 있음. 따라서 비동기적인 방법으로 씬을 로드함

 

App (App씬)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class App : MonoBehaviour
{
    private void Awake()
    {
        DontDestroyOnLoad(this.gameObject);
    }
    void Start()
    {
        //비동기 씬로드
        AsyncOperation oper = SceneManager.LoadSceneAsync("Title");
        oper.completed += (obj) =>
        {
            TitleMain titleMain = GameObject.FindObjectOfType<TitleMain>();
            titleMain.onLoadComplete = () =>
            {
                Debug.Log("Stage1 씬으로 이동");
            };
            titleMain.Init();
        };
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

TitleMain (Title 씬)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;

public class TitleMain : MonoBehaviour
{
    [SerializeField]
    private Image loadingBar;
    private float percent = 0f;
    public UnityAction onLoadComplete;

    public void Init()
    {
        Debug.Log("Init");
    }

    private void Start()
    {
        Debug.Log("Start");
        this.StartCoroutine(this.CoLoading());
    }

    private IEnumerator CoLoading()
    {
        Debug.Log("load start");
        while (true)
        {
            //시간이 흐를때마다 퍼센트 증가
            percent += Time.deltaTime;
            //증가한 퍼센트 만큼 로딩바 채워짐
            loadingBar.fillAmount = percent;
            if(percent >= 1)
            {
                break;
            }
            yield return null;
        }
        Debug.Log("load complete!");
        this.onLoadComplete(); //대리자 호출
    }
}