유니티 비동기 로딩 2편 - 실시간 맵 로딩하기

2020. 7. 23. 18:57유니티실습

반응형

안녕하세요 유니티 비기너입니다.

이번 시간에는 비동기 로딩을 활용한 맵 변경을 하는 법에 대해 알아보겠습니다.

 

테스트 화면

게임 화면

편집 화면

1번 씬에서 특정 지점을 지나쳤을대 2번 씬을 비동기 로드합니다.

2번째 씬의 특정 지점에는 1번 씬을 언로드 합니다.

 

 

SceneController스크립트

public class SceneContoller : MonoBehaviour
{
    public bool reverseAt;

    [SerializeField]
    private string targetScene;

    [SerializeField]
    private string myScene;


    private IEnumerator SceneLoad() {

        var sceneName = SceneManager.GetSceneByName(targetScene);

        if(!sceneName.isLoaded) {
            var addScene = SceneManager.LoadSceneAsync(targetScene, LoadSceneMode.Additive);

            while (!addScene.isDone) {
                yield return null;
            }
        }
    }

    private IEnumerator SceneUnLoad() {

        var sceneName = SceneManager.GetSceneByName(targetScene);
        
        if (sceneName.isLoaded) {

            var currentScene = SceneManager.GetSceneByName(myScene);
            SceneManager.MoveGameObjectToScene(GameObject.FindGameObjectWithTag("GameController"), currentScene);

            var unloadScene = SceneManager.UnloadSceneAsync(targetScene);

            while (!unloadScene.isDone) {
                yield return null;
            }
        }
    }

    private void OnTriggerExit2D(Collider2D other) {

        if(other.CompareTag("Player")) {
            var dir = other.transform.position - transform.position;
            Debug.Log("dir " + dir);
            
            if (dir.x > 0) {
                if (!reverseAt)
                    StartCoroutine(SceneLoad());
                else
                    StartCoroutine(SceneUnLoad());
            } else {
                if(!reverseAt)
                    StartCoroutine(SceneUnLoad());
                else
                    StartCoroutine(SceneLoad());
            }

        }
    }
}

SceneLoad()는 비동기 로드를 이용하여 씬을 불러옵니다.

※ 불러오는 씬의 크기에 따라 버벅거림이 발생할 수 있습니다.

 

SceneUnLoad 활성화되어있는 씬을 비활성화시킵니다.

※ 이전 씬을 비활성화시켜 씬이 계속 쌓이는 메모리 부담을 제거합니다.

 

씬내에는 특정 지점에 해당 이벤트를 호출하는 오브젝트를 배치합니다.

특정 지점을 기준으로 앞쪽 뒤쪽을 분기 처리하여 씬을 활성 / 비활성화시킵니다.

 

FirstScene

보라색으로 표시된 부분에 빈 오브젝트를 생성하고 아래와 같이 설정합니다.

 

Inspector

캐릭터와 충돌을 감지할 BoxCollider와 작성한 스크립트를 컴포넌트에 추가합니다.

 

ActiveScene은 비동기 로드를 할 인접한 다음 장면의 씬명을 입력하고

InActiveScene은 비활성화 시킬 인접한 씬명을 입력합니다.

 

위의 방식을 활용하여 실시간 씬 로드가 가능하며

불러오는 씬의 데이터양이 클수록 버벅거림이 발생할 수 있기 때문에

씬의 크기를 먼저 고려하고 적용하는 것이 좋을 거 같습니다.

 

이상으로 비동기 로드 2편에 대한 간단한 소개를 마치겠습니다.

감사합니다.

 

반응형