집게사장의 꿈

[영혼들] 씬 불러오기 본문

제작/영혼들

[영혼들] 씬 불러오기

Krapboss 2024. 8. 2. 03:16

씬 불러오기


씬을 로드하는 과정에서 중간 씬을 거치지 않고 바로 로드하니 메모리 사용 초과로 모바일에서 강제 종료되는 현상이 발생했습니다.
그렇기에, 중간씬을 추가하여 로드하였습니다.

 


SceneLoader

씬을 불러올 때, static 함수를 사용하여 로딩 씬을 불러온 후 다음 씬에서 실행할 동작을 지정받습니다.
로딩씬에서 Start()를 통해 지정된 다음씬을 로드합니다.

//씬에 대한 정보를 가지고 있는다.
public class SceneInformation
{
    public string SceneName = null;          //로딩할 씬의 이름
    public Action SceneEndAction = null;     //씬 로딩 후 실행 할 것
    public bool SceneLoading = false;         //씬 로딩 완료 여부
}

//씬 로딩을 위한 전역함수
public static void LoadLoaderScene(string _name, Action _action=null)
{
    SceneManager.LoadScene("LoadScene");
    SceneLoader.sceneInformation.SceneName = _name;
    SceneLoader.sceneInformation.SceneEndAction = _action;
    SceneLoader.sceneInformation.SceneLoading = false;
}

 

전체 코드
//로딩 씬 빈 오브젝트에 추가되어있습니다.
public class SceneLoader : MonoBehaviour
{
    public static SceneInformation sceneInformation = new SceneInformation();

    public TMP_Text txt_tip;
    public Image img_progress;
    public Animation anim_dot;

    void Start()
    {
        DontDestroyOnLoad(this.gameObject);
        StartCoroutine(SceneLoad());
		
        //씬 전체의 사운드 변경 동작을 저장합니다.
        Setting.Action_SoundChanger = null;
    }

    IEnumerator SceneLoad()
    {
        Debug.LogWarning("씬을 불러오는 중.....");

        //화면 보이기
        Fade.FadeSetting(false,1.0f,Color.white);
        //화면 보이는 동안 대기
        yield return new WaitUntil(() => Fade.b_faded);


       // Debug.LogWarning("씬 로딩 1");

        //팁과 애님 실행
        txt_tip.text = LocalLanguageSetting.Instance.GetLocalText("Tip", $"Loading{Random.Range(1, 3)}");
        anim_dot.Play();


        //Debug.LogWarning("씬 로딩 2");

        //씬 로딩을 위한 함수
        AsyncOperation _operation = SceneManager.LoadSceneAsync(sceneInformation.SceneName);
        _operation.allowSceneActivation = false;


        //Debug.LogWarning("씬 로딩 3");

        //로딩 진행도 표시
        float _progress = 0.0f;
        while (_progress < 0.89f)
        {
            if (_progress > _operation.progress) { continue; }

            _progress += Time.unscaledDeltaTime * 0.333f;

            img_progress.fillAmount = _progress;

            yield return null;
        }
        
        //1초 지연한다.
        float time = 0;
        while (time < 1.0f)
        {
            time += Time.unscaledDeltaTime;
            img_progress.fillAmount = Mathf.Lerp(0.9f, 1.0f, time);
        }


        //Debug.LogWarning("씬 로딩 4");

        //씬을 로드시킨다.
        _operation.allowSceneActivation = true;
        //작업이 끝날때까지 대기 시킨다.
        while (!_operation.isDone)
        {
            Debug.Log("맵을 불러오고 있습니다.");
            yield return null;
        }

        //FadeOut
        Fade.FadeSetting(false, 1.0f, Color.white);


        //Debug.LogWarning("씬 로딩 5");

        //씬 하면서 지정된 동작을 수행합니다.
        if (sceneInformation.SceneEndAction != null)
        {
            sceneInformation.SceneEndAction();
            sceneInformation.SceneEndAction = null;
        }

        Debug.Log("씬을 로드에 성공했습니다. : " + sceneInformation.SceneName);

        //종료를 알림
        sceneInformation.SceneLoading = false;
        Time.timeScale = 1.0f;

        //현재 로딩 오브젝트 제거
        Destroy(gameObject);
    }

 


실제 플레이

설명
게임을 시작하면서 LoadScene가 로드 되고, Loader가 동작하면서 지정된 다음씬을 불러와 Loader에서 지정된 동작을 수행합니다.