1 분 소요

Intro

이번 포스팅에서는 포탈을 타고 씬을 변경하는것을 구현해보았습니다.

플레이어가 포탈에 접근하면 잠시동안의 로딩화면이 끝난 뒤 다음 씬으로 이동합니다.

image

포탈

포탈은 파티클 시스템으로 만들었습니다.

image

포탈에 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% 진행되었을 때 천천히 차오르도록 했습니다.
    • 로딩바 위에 게임 팁을 보여주도록 했습니다.

댓글남기기