1 / 메인 화면 GameManager 코드.
public class GameManager : MonoBehaviour
{
public static GameManager GM_Instance;
public string scenename;
// Start is called before the first frame update
void Start()
{
if (GM_Instance == null)
{
GM_Instance = this;
DontDestroyOnLoad(gameObject);
}
}
// Update is called once per frame
void Update()
{
}
public void One()
{
scenename = "MineOne";
SceneManager.LoadScene("Loading");
}
}
2 / Loading Scene 코드.
public class Loading : MonoBehaviour
{
[SerializeField] Slider Loading_bar;
[SerializeField] float time;
[SerializeField] string scenenames;
[SerializeField] GameObject Loading_bar_text;
// Start is called before the first frame update
void Start()
{
scenenames = GameManager.GM_Instance.scenename;
Loading_bar.maxValue = 1.0f;
StartCoroutine(LoadScene(scenenames));
}
// Update is called once per frame
void Update()
{
time += Time.deltaTime;
Loading_bar.value = time;
Loading_bar_text.transform.GetComponent<TextMeshProUGUI>().text = "Loading... " + (Mathf.Floor(time * 100f) / 100f) * 100f + "%";
}
IEnumerator LoadScene(string name)
{
yield return null;
AsyncOperation op = SceneManager.LoadSceneAsync(name); // 비동기 Scene 로딩 ( 로딩할 Scene 이름 )
op.allowSceneActivation = false; // Scene 이 로딩 되었을때 바로 실행할지 .
yield return new WaitForSecondsRealtime(1.0f); // 1초 대기
op.allowSceneActivation = true; // 로딩된 Scene 실행.
}
}
https://docs.unity3d.com/kr/530/ScriptReference/AsyncOperation.html
UnityEngine.AsyncOperation - Unity 스크립팅 API
Asynchronous operation coroutine.
docs.unity3d.com
allowSceneActivation | 로딩 하려는 Scene이 로딩 되었을경우 바로 로딩할지 여부 |
isDone | 로딩 되었는지 여부. |
progress | 로딩 정도를 0~1 사이의 값으로 반환해줌. |
AsyncOperation 내부 변수들을 사용하여 구현할수 있다.
총 Scene을 3개를 사용하였다.
1. Main
2. Loading
3. Mineone
1번 Scene이 메인이고 2번 Scene 로딩 화면 구성. 3번 Scene 던전 느낌이다.
모든 던전이나 메인 Scene은 2번 로딩 Scene을 거쳐서 Scene 전환이 되게 구현한다.
첫 번째 GameManager 스크립트는. Main Scene에서 생성된다.
MainScene 내에서 내가 정한 행동을 수행하면 One()이라는 함수를 호출하게 되고.
Scene은 Loading Scene으로 넘어가게 된다.
LoadingScene 에서는 Loading이라는 코드가 존재하게 되고. 이 코드는.
GameManager 스크립트에 있는 목적지 Scene 이름을 불러와서.
코 루틴으로 불러온 Scene을 비동기 로딩한다.
AsyncOperation op = SceneManager.LoadSceneAsync(name); // 비동기 Scene 로딩 ( 로딩할 Scene 이름 )
그 이후 로딩 바가 100%가 될떄까지 기다리기 위해서.
op.allowSceneActivation = false; 이 코드를 사용하여 로딩되어도 바로 실행 되지 않게 한다.
이후.
로딩 바가 100% 가 된다면.
op.allowSceneActivation = true; true로 바꿔주면 로딩된 화면으로 넘어간다.
Scene이 전환될떄 Loading 바를 만드는 방법이 두 가지 있는데
하나는 고정된 시간을 두는 법.
두 번쨰는 progress를 사용하여 실제 로딩 시간을 반영하는 법.
그런데 저는 Scene 데이터가 무겁지 않아서 로딩 시간이 빠르기떄문에 progress를 사용할 경우
로딩 바가 급격하게 오르고 거의 바로 Scene 전환이 되어서.
로딩 시간을 1초로 고정해서 사용하였습니다.
이런 식으로.
로딩 Scene에서
로딩 % 가 1초 만에 100%까지 증가하고 Scene이 넘어가게 된다.
'유니티' 카테고리의 다른 글
[ Unity ] TextMeshPro Script 제어 방법 (0) | 2023.05.22 |
---|---|
[ Unity ] TextMeshPro에 Color Gradient를 스크립트로 변경하는 법. (0) | 2023.04.14 |
[ Unity ] UI를 사용해 FPS를 보는 방법. (0) | 2023.04.09 |
[ Unity ] Prefab을 생성 할떄 Hierarchy 창에서 정리 하는법. (0) | 2023.04.08 |
[ Unity ] URP를 사용할 때 Transparency Sort Axis를 설정 하는 법. (0) | 2023.04.08 |