Posts 유니티 - 비동기 씬 로드
Post
Cancel

유니티 - 비동기 씬 로드

GIF


2021_0706_LoadSceneAsync

Source Code


Source Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

// 날짜 : 2021-07-06 PM 3:02:23
// 작성자 : Rito

/// <summary> 
/// 비동기 씬 로드
/// </summary>
public class AsyncSceneLoader : MonoBehaviour
{
    /***********************************************************************
    *                               Inspector Fields
    ***********************************************************************/
    #region .
    public string _nextSceneName;

    public Image _loadingBar;
    public Button _LoadNextSceneButton;
    public Button _moveToNextSceneButton;

    /// <summary> 최소 로딩 소요 시간 </summary>
    [Space]
    public float _minLoadDuretion = 4.0f;

    #endregion
    /***********************************************************************
    *                               Fields
    ***********************************************************************/
    #region .
    private AsyncOperation _loadOperation;

    public bool LoadCompleted
    {
        get => _loadCompleted;
        set
        {
            _loadCompleted = value;
            _moveToNextSceneButton.interactable = value;
        }
    }
    private bool _loadCompleted;

    public float LoadRatio
    {
        get => _loadRatio;
        set
        {
            _loadRatio = value;
            _loadingBar.fillAmount = value;
        }
    }
    private float _loadRatio;

    #endregion
    /***********************************************************************
    *                               Unity Events
    ***********************************************************************/
    #region .
    private void Awake()
    {
        LoadCompleted = false;
        LoadRatio = 0.0f;

        _LoadNextSceneButton.onClick.AddListener(LoadNextScene);
        _moveToNextSceneButton.onClick.AddListener(MoveToNextScene);
        _moveToNextSceneButton.gameObject.SetActive(false);
    }

    #endregion
    /***********************************************************************
    *                               Methods
    ***********************************************************************/
    #region .
    private void LoadNextScene()
    {
        _LoadNextSceneButton.gameObject.SetActive(false);
        _moveToNextSceneButton.gameObject.SetActive(true);
        StartCoroutine(LoadSceneRoutine());
    }

    private void MoveToNextScene()
    {
        _loadOperation.allowSceneActivation = true;
    }

    /// <summary> 로 딩 루 틴 </summary>
    private IEnumerator LoadSceneRoutine()
    {
        /*
            * - 로딩 구성 : 진짜 비동기 로딩 + 가짜 로딩 => 최소값으로 로딩 게이지에 설정
            * - 가짜 로딩 쓰는 이유 : 최소 로딩 시간을 지정해서 좀더 로딩 같아 보이도록(테스트용)
            * 
            * - Note : _loadOperation.allowSceneActivation이 false인 동안에는
            *          _loadOperation.progress 값이 0.9까지만 상승
            *          그리고 allowSceneActivation이 true가 되면 즉시 로딩됨
            * 
            */

        // 진짜 로딩
        _loadOperation = SceneManager.LoadSceneAsync(_nextSceneName);
        _loadOperation.allowSceneActivation = false;

        // 가짜 로딩
        float fakeLoadTime = 0f;
        float fakeLoadRatio = 0f;

        while (!_loadOperation.isDone)
        {
            // 가짜 로딩 계산
            fakeLoadTime += Time.deltaTime;
            fakeLoadRatio = fakeLoadTime / _minLoadDuretion;

            // 실제 로딩과 가짜 로딩 중 최소값으로 로딩률 지정
            LoadRatio = Mathf.Min(_loadOperation.progress + 0.1f, fakeLoadRatio);
            Debug.Log("Load.." + _loadOperation.progress);

            if (LoadRatio >= 1.0f)
                break;

            yield return null;
        }

        // Finished
        LoadRatio = 1.0f;
        LoadCompleted = true;
    }

    #endregion
}

Download


This post is licensed under CC BY 4.0 by the author.