오늘은 씬 매니저에 대해 알아보겠다.
씬을 이동하고 또 씬 안에 씬을 넣기도 가능하도록 구현할 예정이다.
SceneManager
씬 매니저를 만들어보자.
씬 매니저는 이미 유니티에서 정의하고 있는 클래스이므로 SceneLoadManager라고 이름을 지어주겠다.
씬 매니저는 항상 존재하도록 싱글톤을 상속 받고 DontDestory = true를 해준다.
protected override void Awake()
{
base.Awake();
nowSceneName = SceneManager.GetActiveScene().name;
Test();
}
현재 씬의 이름을 nowSceneName라는 변수로 가져와준다.
이제는 전환을 해보자.
public async void ChangeScene(string SceneName, Action callback = null, LoadSceneMode loadSceneMode = LoadSceneMode.Single)
{
var operation = SceneManager.LoadSceneAsync(SceneName, loadSceneMode);
while (!operation.isDone)
{
Debug.Log("로딩창 띄우기");
await Task.Yield();
}
callback?.Invoke();
}
async로 비동기 작업을 수행하는 메소드로 만들어주고,
매개변수로 해당 씬의 이름, 콜백, 씬 로드 모드를 받아준다.
그리고 비동기적으로 씬 로드를 해주고, while문을 통해 로드가 되었다면 콜백함수를 호출함으로 씬 로드가 완료되고, 로드가 되기 전까지는 while문을 계속해서 실행하며 로드창을 띄워준다. 지금은 debug로 하고 있지만 추후 수정할 예정이다.
이제 다른 씬을 로드 해보자.
던전 입장을 해보자.
던전씬 스크립트를 작성하고, 위에서 만들어준 씬 로드매니저의 changeScene을 호출하면 된다.
public void OnExitDungeon()
{
SceneLoadManager.Instance.ChangeScene("Game", () =>
{
Debug.Log("게임 씬 로드 완료");
}, UnityEngine.SceneManagement.LoadSceneMode.Single);
}
위 처럼 씬 이름, 콜백은 현재는 없으므로, 비워두고 디버그만 남겨두자. 그리고 로드 모드를 싱글로 하여 하나의 씬만을 로드하게 된다.
Additive를 사용하면 씬 안에 씬을 로드할 수도 있다.