⚠️아랫분의 강좌에서 공부해서 정리한 글입니다. ↓
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 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가 인스턴스 있기 때문에 재활용해서 다시 생성안합니다.
'유니티 > 유니티 관련 지식' 카테고리의 다른 글
유니티 에디터 Game뷰 프레임 올리는 법 모음 (수정) (1) | 2024.02.04 |
---|---|
유니티 깃 관리 (0) | 2023.12.26 |
유니티 멀티플레이에서 로컬 싱글톤 (2) | 2023.04.12 |
유니티 싱글톤 쓸만한거만 정리 (0) | 2023.04.12 |