05
19

썸네일

⚠️아랫분의 강좌에서 공부해서 정리한 글입니다. ↓

https://github.com/GameDevEducation/DevToolkit_BootstrappedScenes/tree/master/Assets/Scripts

https://www.youtube.com/watch?v=hcUX-VdUnb8 

 

 

Bootstrap 씬은 말 그대로 부팅할 때 리소스나 데이터 로드하는 씬입니다.

이걸로 씬 전환해도 바로바로 필요한 인벤토리 아이템이라던지 돈 데이터 가져올 수 있습니다.

 

 


기본적인 Scene 세팅하기

 

우선 씬은 총 3개로 Main Menu, Main Level, BootstrapScene이 될 것입니다.

BootstrapScene은 놔두고 먼저 씬 전환할 메인메뉴랑 메인 레벨 씬을 만들어 줍니다.

 

Main Level 씬에는 그냥 메인으로 돌아가는 버튼 하나만 구현하시면 됩니다.

Main Level 씬

Main Menu 씬에는 그냥 메인으로 돌아가는 버튼 하나만 구현하시면 됩니다.

Main Menu 씬

 

두씬 모두 씬 전환 하는 버튼에 아래 스크립트를 연결했습니다. ↓

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

public class SceneLoadHelper : MonoBehaviour
{
    public void LoadScene(string name)
    {
        SceneManager.LoadScene(name, LoadSceneMode.Single);
    }
}

 


Bootstrap Scene 씬을 만들기

우선 Bootstrap Scene을 만든 뒤, Ctrl + shift + B를 눌러 빌드 창을 열고 BootstrapScene을 추가합니다.

 

그리고 BootstrapScene에 BootstrappedData 스크립트를 만들어 오브젝트에 붙여둡니다.

 

BootstrappedData 스크립트 ↓

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

public static class PerformBootstrap
{
    const string SceneName = "Bootstrapped Scene";

    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
    public static void Execute()
    {
        // traverse the currently loaded scenes
        for (int sceneIndex = 0; sceneIndex < SceneManager.sceneCount; ++sceneIndex)
        {
            var candidate = SceneManager.GetSceneAt(sceneIndex);

            // early out if already loaded
            if (candidate.name == SceneName)
                return;
        }

        Debug.Log("Loading bootstrap scene: " + SceneName);

        // additively load the bootstrap scene
        SceneManager.LoadScene(SceneName, LoadSceneMode.Additive);
    }
}

public class BootstrappedData : MonoBehaviour
{
    public static BootstrappedData Instance { get; private set; } = null;

    void Awake()
    {
        // check if an instance already exists
        if (Instance != null)
        {
            Debug.LogError("Found another BootstrappedData on " + gameObject.name);
            Destroy(gameObject);
            return;
        }

        Debug.Log("Bootstrap initialised!");
        Instance = this;

        // prevent the data from being unloaded
        DontDestroyOnLoad(gameObject);
    }

    public void Test()
    {
        Debug.Log("Bootstrap is working!");
    }
}

스크립트에서 RuntimeInitializeOnLoadMethod 부분을 눈여겨봐야합니다.

RuntimeInitializeOnLoadMethod은 게임 시작시 자동으로 시작됩니다.

Monobehaviour가 없어도 되고, static 메서드(함수)에서만 적용이 된다고 합니다.

더 자세한 RuntimeInitializeOnLoadMethod ↓

https://mentum.tistory.com/680

 

⚠️ SceneName 변수 부분이 바로 전환할 씬 이름이기 때문에 이 부분을 정확하게 써야합니다.

 


LazyBootstrap Scene 씬을 만들어서 비교해보기

 

Lazy 방식은 말그대로 게으르기 때문에 필요할 때만 초기화를 생성합니다.

초기화할 리소스가 많아서 시간이 오래 걸리는 경우에 적합합니다.

 

LazyBootstrappedData 스크립트 ↓

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

public class LazyBootstrappedData
{
    private static LazyBootstrappedData _Instance = null;
    public static LazyBootstrappedData Instance
    {
        get
        {
            // create the instance if not present
            if (_Instance == null)
                _Instance = new LazyBootstrappedData();

            return _Instance;
        }
    }
    private LazyBootstrappedData()
    {
        Debug.Log("Created LazyBootstrappedData");
        // perform loading of data here
    }
    public void Test()
    {
        Debug.Log("LazyBootstrapper is working!");
    }
}

보다시피 싱글톤 패턴 비슷하게 생겨서 인스턴스가 필요한 시점에 생성됩니다.

이를 통해 초기화 작업이 필요한 경우에만 인스턴스가 생성되고,

인스턴스의 재사용을 통해 성능을 향상시킬 수 있습니다.

 

그리고 Monobehaviour도 상속 안하고 오브젝트 없어도 잘 작동합니다.

 


테스트

 

지금까지의 BootstrappedData와 LazyBootstrappedData 스크립트 모두 Test() 메서드 있습니다.

그렇기 때문에 아래 코드를 메뉴씬과 레벨 씬에 오브젝트를 하나 만들어 붙여줘서 테스트해봅시다.

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

public class BootstrapTest : MonoBehaviour
{
    void Start()
    {
        BootstrappedData.Instance.Test();
        LazyBootstrappedData.Instance.Test();
    }
}

처음 실행 할 때
껏다 다시 시작할 때


보다시피 Lazy로 만든건 처음에만 없으면 생기고 Play 모드 끄고 다시 시작해보면,

LazyBootstrappedData가 인스턴스 있기 때문에 재활용해서 다시 생성안합니다.

 

COMMENT