• 티스토리 홈
  • 프로필사진
    개양반
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
개양반
  • 프로필사진
    개양반
    • Everybody Happyvirus (87)
      • Unity DOTS (19)
        • ECS Sample Projtect (8)
        • Unity.Physics (1)
        • TIP (9)
      • Unity Assets 추천 (6)
        • BG Database (5)
        • I2 Localization - 현지화 (1)
      • Unity 자습서 (15)
        • Addressable (4)
        • 유니티 + 파이어베이스 (0)
        • GamingServices (10)
      • 주식 이야기 (4)
        • 회사 소개 (2)
        • 회사 정보 (1)
        • 실적 발표 (0)
      • 일상 생활 (9)
        • 도서리뷰 (2)
        • 제품리뷰 (6)
      • 게임일기 (2)
        • 리그오브레전드 (2)
      • 게임소개 (4)
      • 게임리뷰 (7)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • 유니티 Addressable #4 - 씬 로드와 게임오브젝트 Instantiate
        2020년 09월 10일
        • 개양반
        • 작성자
        • 2020.09.10.:28

        오늘은 번들에 올라간 Scene을 로드하는 방법과 게임오브젝트를 로드하고 언로드하는 방법에 배웁니다.

        ※ Scene을 번들에 올려서 사용하면 Scene에서 게임오브젝트의 위치가 바뀌는 등의 변경이 있을 경우 유저는 APK 를 다시 설치할 필요없이 서버에서 변경된 Scene을 다운받아 변경된 부분이 자연스럽게 패치되도록 할 수 있습니다.


        가. 에셋 준비

        1. Scene 준비하기

        씬을 두개 만듭니다. 이름을 StartScene, CubeScene 으로 변경합니다.  

         

        1-1 StartScene

        아래와 같이 버튼을 추가합니다. 

         

        1-2 CubeScene 

        CubeScene을 열고 Cube를 대충 설치합니다. MainCamera에 있는 Audio Listener 를 삭제합니다. 

        CubeScene의 Addressable을 활성화하고 주소를 CubeScene으로 변경합니다.

         

        1-3 SampleScene

        이전 강좌에서 사용했던 SampleScene을 엽니다. 버튼 두개를 추가합니다.

        SampleScene의 Addressable을 활성화하고 주소를 변경합니다.

         

        나. Sphere 오브젝트 만들기

        아무 씬에서 Sphere 게임 오브젝트를 만들고 프리팹으로 만듭니다. Addressable을 활성화하고 주소를 변경합니다. Hirarchy창에 있는 Sphere는 삭제합니다.


        나. 스크립트 작성

        1. NextScene.cs 생성 후 작성

        using System.Collections;
        using System.Collections.Generic;
        using UnityEngine;
        using UnityEngine.AddressableAssets;
        
        public class NextScene : MonoBehaviour
        {
            public string NextSceneAddress;
          
        
            public void OnNextScene()
            {
        
                // 매개변수에는 String 뿐만 아니라
                // public AssetReference reference; 등 키를 전달할 수 있으면 된다.
                Addressables.LoadSceneAsync(NextSceneAddress);
        
            }
        }

        #주요 코드

        Addressables.LoadSceneAsync(Key); 에셋번들에 올라간 씬을 로드하는 코드입니다.

         

        2.  SceneLoadAndObjectInstantiate.cs 생성 후 작성

        using System;
        using System.Collections;
        using System.Collections.Generic;
        using UnityEngine;
        using UnityEngine.AddressableAssets;
        using UnityEngine.ResourceManagement.AsyncOperations;
        using UnityEngine.ResourceManagement.ResourceProviders;
        using UnityEngine.SceneManagement;
        
        public class SceneLoadAndObjectInstantiate : MonoBehaviour
        {
            public AssetReference addSceneReference;
            public AssetReferenceGameObject sphereReference;
        
        
            bool isSphereLoad = false;
            SceneInstance m_LoadedScene;
            List<GameObject> sphereGameObjects = new List<GameObject>();
        
        
            // Scene 관련 코드--------------
            // 버튼 클릭 이벤트
            public void OnSceneAction()
            {
                if (m_LoadedScene.Scene.name == null)
                {
                    Addressables.LoadSceneAsync(addSceneReference, LoadSceneMode.Additive).Completed += OnSceneLoaded;
                }
                else
                {
                    Addressables.UnloadSceneAsync(m_LoadedScene).Completed += OnSceneUnloaded;
                }
            }
        
            private void OnSceneUnloaded(AsyncOperationHandle<SceneInstance> obj)
            {
                switch (obj.Status)
                {
                    case AsyncOperationStatus.Succeeded:
                        m_LoadedScene = new SceneInstance();
                        break;
                    case AsyncOperationStatus.Failed:
                        Debug.LogError("씬 언로드 실패: " + addSceneReference.AssetGUID);
                        break;
                    default:
                        break;
                }
            }
        
            private void OnSceneLoaded(AsyncOperationHandle<SceneInstance> obj)
            {
                switch (obj.Status)
                {
                    case AsyncOperationStatus.Succeeded:
                        m_LoadedScene = obj.Result;
                        break;
                    case AsyncOperationStatus.Failed:
                        Debug.LogError("씬 로드 실패: " + addSceneReference.AssetGUID);
                        break;
                    default:
                        break;
                }
            }
        
        
        
            // Sphere 관련 코드--------------
            // 버튼 클릭 이벤트
            public void OnSphereAction()
            {
                if (isSphereLoad == false)
                {
                    // sphereReference.LoadAssetAsync().Completed += op => {} 람다식으로 처리할 수도 있다.
                    sphereReference.LoadAssetAsync().Completed += OnSphereLoaded;
                    isSphereLoad = true;
                }
                else
                {
                    // sphereReference.InstantiateAsync 형태로 인스턴트화 했다면
                    // sphereReference.ReleaseInstantiate(해당 게임오브젝트) 로 릴리즈한다.
                    // sphereReference.InstantiateAsync 로 했는데 sphereReference.ReleaseAsset();를 호출하면
                    // 해당 개체는 메모리에 올라간 것이 없다고 경고가 출력된다.
                    sphereReference.ReleaseAsset();
                    DestroySphere();
                    isSphereLoad = false;
                }
            }
        
            private void OnSphereLoaded(AsyncOperationHandle<GameObject> obj)
            {
                switch (obj.Status)
                {
                    case AsyncOperationStatus.Succeeded:
                        InstantiateObject(obj.Result);
                        break;
                    case AsyncOperationStatus.Failed:
                        Debug.LogError("OnSphereLoaded Failed");
                        break;
                    default:
                        break;
                }
            }
        
            void InstantiateObject(GameObject obj)
            {
                for (int i = 0; i < 5; i++)
                {
                    Vector3 rndVector = new Vector3(UnityEngine.Random.Range(-3, 3), UnityEngine.Random.Range(-3, 3), 0);
                    sphereGameObjects.Add(Instantiate(obj, rndVector, Quaternion.identity));
                }
            }
        
            void DestroySphere()
            {
                for (int i = sphereGameObjects.Count -1; i >= 0; i--)
                {
                    Destroy(sphereGameObjects[i]);
                }
            }
        }

        #주요 코드

        public AssetReferenceGameObject sphereReference; 게임오브젝트로 된 에셋만 참조할 수 있는 변수입니다.

        SceneInstance m_LoadedScene; 로드된 씬의 인스턴트를 참조시킬 변수입니다.

        Addressables.LoadSceneAsync(addSceneReference, LoadSceneMode.Additive) 에서 LoadSceneMode.Additive는 씬을 새로 열지 않고 현재 열려있는 씬에다가 추가로 연다는 의미입니다. addSceneReference는 로드할 씬의 Key를 입력합니다.

        Addressables.UnloadSceneAsync(m_LoadedScene).Completed += OnSceneUnloaded; 해당 씬을 언로드할 때 사용하는 코드입니다. Unload를 통해 메모리에 올라간 해당 에셋을 내립니다.


        다. 컴포넌트 설정

        1. StartScene 

        StartScene 을 열고 빈 게임오브젝트를 만듭니다. 해당 오브젝트에 NextScene.cs를 컴포넌트로 추가하고 변수에 Main을 입력합니다. 그리고 앞에서 만든 버튼에 NextScene.cs의 OnNextScene()가 호출되도록 연결합니다.

        2. SampleScene

        SampleScene을 열고 Loader 오브젝트에 SceneLoadAndObjectInstantiate.cs 를 연결합니다. 다른 스크립트는 비활성화시킵니다. Cube Action, Sphere Action 버튼에 클릭 이벤트를 연결합니다.


        라. 테스트하기

        StartScene을 열고 재생버튼을 눌러 테스트합니다. 각 버튼을 누를때마다 Addressable Event Viewer의 정보가 어떻게 바뀌는지 확인합니다.

         

        https://paypal.me/Mrbinggrae?locale.x=ko_KR

        블로그를 후원해주시면 더욱 열심히 좋은 자료를 만들겠습니다.

        저작자표시 (새창열림)

        'Unity 자습서 > Addressable' 카테고리의 다른 글

        유니티 Addressable #3 - 원하는 타입의 레퍼런스 만들 기  (0) 2020.09.07
        유니티 Addressable #2 - 스프라이트  (0) 2020.09.06
        유니티 Addressable #1 - 기본편  (0) 2020.09.05
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바