유니티 RPG - 39. 씬 변경 및 로딩
Intro
이번 포스팅에서는 포탈을 타고 씬을 변경하는것을 구현해보았습니다.
플레이어가 포탈에 접근하면 잠시동안의 로딩화면이 끝난 뒤 다음 씬으로 이동합니다.
포탈
포탈은 파티클 시스템으로 만들었습니다.
포탈에 Sphere 콜라이더를 붙여준 뒤, 씬 변경을 위한 스크립트 “SceneChange” 를 작성합니다.
public class SceneChange : MonoBehaviour
{
[Header("Next Scene Name")]
public string nextScene; // 연결된 씬 이름
private void OnTriggerEnter(Collider other)
{
if (!other.CompareTag("Player"))
return;
// 씬 불러오기
Loading.LoadNextScene(nextScene);
}
}
-
nextScene 은 이동될 다음 씬의 이름으로, 인스펙터 창에서 설정하도록 했습니다.
-
OnTriggerEnter() 함수로 플레이어가 콜라이더에 충돌하면 씬이 변경되도록 했습니다.
씬 변경 및 로딩
“Loading” 클래스는 씬 변경 및 로딩 화면을 위한 클래스입니다.
public class Loading : MonoBehaviour
{
[SerializeField] private Image progressBar;
[SerializeField] private Text tipText;
private static string nextScene;
string[] gameTips =
{
"플레이어가 사망하면 마을로 돌아갑니다.",
"포션으로 체력과 마나를 보충할 수 있습니다.",
"더 좋은 장비는 던전을 클리어하는데 큰 도움이 됩니다."
};
private void Start()
{
StartCoroutine(LoadSceneProgress());
ShowGameTips();
}
// 로딩씬 불러오기
public static void LoadNextScene(string sceneName)
{
nextScene = sceneName;
SceneManager.LoadScene("Loading");
}
private IEnumerator LoadSceneProgress()
{
AsyncOperation op = SceneManager.LoadSceneAsync(nextScene);
op.allowSceneActivation = false;
float timer = 0f;
while(!op.isDone)
{
yield return null;
if(op.progress < 0.9f)
{
progressBar.rectTransform.sizeDelta = new Vector2(op.progress * 1920f, 80f);
}
else
{
timer += Time.unscaledDeltaTime;
progressBar.rectTransform.sizeDelta = new Vector2(1728f + timer * 20f, 80f);
if(progressBar.rectTransform.sizeDelta.x >= 1920f)
{
op.allowSceneActivation = true;
yield break;
}
}
}
}
private void ShowGameTips()
{
int ran = Random.Range(0, gameTips.Length);
tipText.text = "Game Tip. " + gameTips[ran];
}
}
- 포탈에 접근하면 Loading 클래스의 LoadNextScene() 함수를 호출합니다.
- 다음 씬의 이름을 매개변수로 받아 저장하고, Loading 씬을 불러옵니다.
- 로딩씬에서는 로딩바를 통해 다음 씬 로딩의 진행도를 표시합니다.
- 불러오는 씬은 텅 비어있는 씬으로, 불러오는 속도가 빠르므로 로딩씬이 빠르게 지나갑니다.
- 따라서 fake 로딩을 주어 로딩이 90% 진행되었을 때 천천히 차오르도록 했습니다.
- 로딩바 위에 게임 팁을 보여주도록 했습니다.
댓글남기기