• 티스토리 홈
  • 프로필사진
    개양반
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
개양반
  • 프로필사진
    개양반
    • 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 #3 - 원하는 타입의 레퍼런스 만들 기
        2020년 09월 07일
        • 개양반
        • 작성자
        • 2020.09.07.:39

        가. 오늘 공부할 내용

        유니티 에디터에서 인스펙터를 통해 AssetReference 변수로 번들에 있는 에셋을 참조시키는 방법을 배웠습니다.

        AssetReference변수는 모든 에셋 리스트가 표시된다.

        하지만, 이렇게 모든 타입의 에셋 리스트가 표시되면 실수를 할 수 있게 됩니다. 예를 들면 스프라이트만 참조해야 하는데 클릭미스로 게임 오브젝트를 참조시킨다는 등의 실수 말이죠. 이런 실수를 방지하기 위해 AssetReferenceGameObject, AssetReferenceSprite, AssetReferenceTexture 등이 존재하지만 이 리스트에 없는 Material 등 특정 타입은 어떻게 해야 하는지 알아보겠습니다.


        나. 머터리얼 제작

        테스트로 사용할 머터리얼을 하나 제작합니다.


        다. 스크립트 작성

        1. FilteredReferences.cs 생성 및 작성

        아래 코드를 작성합니다.

        using System;
        using System.Collections;
        using System.Collections.Generic;
        using UnityEngine;
        using UnityEngine.AddressableAssets;
        using UnityEngine.ResourceManagement.AsyncOperations;
        
        public class FilteredReferences : MonoBehaviour
        {
            // AssetReferenceT<원하는 타입> 을 상속 받습니다.
            // AssetReferenceMaterial 를 통해서 Material 타입의 에셋을 참조할 수 있습니다.
            [Serializable]
            public class AssetReferenceMaterial : AssetReferenceT<Material>
            {
                public AssetReferenceMaterial(string guid) : base(guid) { }
            }
        
            private SpriteRenderer spriteRenderer;
        
            // Material 타입 에셋을 참조할 수 있는 커스텀 변수입니다.
            public AssetReferenceMaterial materialReference;
            public AssetReferenceSprite spriteReference;
        
            private void Start()
            {
                spriteRenderer = GetComponent<SpriteRenderer>();
            }
        
            public void OnLoadSprite()
            {
                spriteReference.LoadAssetAsync().Completed += SpriteLoaded;
            }
        
            public void OnLoadMaterial()
            {
                materialReference.LoadAssetAsync().Completed += MaterialLoaded;
            }
        
            public void OnUnLoadSprite()
            {
                // ReleaseAsset() 을 통해 메모리에 올라간 에셋레퍼런스를 해제합니다.
                spriteReference.ReleaseAsset();
            }
        
            public void OnUnLoadMaterial()
            {
                // ReleaseAsset() 을 통해 메모리에 올라간 에셋레퍼런스를 해제합니다.
                materialReference.ReleaseAsset();
            }
        
        
            private void SpriteLoaded(AsyncOperationHandle<Sprite> obj)
            {
                switch (obj.Status)
                {
                    case AsyncOperationStatus.Succeeded:
                        spriteRenderer.sprite = obj.Result;
                        break;
        
                    case AsyncOperationStatus.Failed:
                        Debug.Log("스프라이트 로드 실패");
                        break;
        
                    default:
                        break;
                }
            }
        
            private void MaterialLoaded(AsyncOperationHandle<Material> obj)
            {
                switch (obj.Status)
                {
                    case AsyncOperationStatus.Succeeded:
                        spriteRenderer.material = obj.Result;
                        break;
        
                    case AsyncOperationStatus.Failed:
                        Debug.Log("스프라이트 로드 실패");
                        break;
        
                    default:
                        break;
                }
            }
        }

        #주요 코드

        public class AssetReferenceMaterial : AssetReferenceT<Material>
        {
                public AssetReferenceMaterial(string guid) : base(guid) { }
        }

        AssetReferenceMaterial는 제가 만든 클래스 입니다. AssetReferenceT<T> 를 상속받습니다. 생성자를 통해 에셋이 참조될때 해당 guid를 참조시킵니다. 유니티에서 제공하는 AssetReference타입 외 다른 타입의 에셋레퍼런스를 참조시킬때 위 코드를 사용하시면 됩니다.


        라. 컴포넌트 연결 및 버튼 추가

        1. Loader 오브젝트

        Loader 오브젝트의 AddressableSpriteLoader.cs 는 비활성화합니다. 위에서 만든 스크립트를 추가하고 각 변수에 알맞은 에셋레퍼런스를 연결합니다. 

        2. 버튼 추가

        4개의 버튼을 만들었습니다. 위 스크립트를 이해하신 분들이라면 각 버튼에 어떤 이벤트가 걸려야 하는지 아실거라 생각합니다.

         

        3. Send Profiler Events 활성화

        Addressables Events Viewer 로 에셋이 메모리에 어떤 식으로 올라가는지 확인할 겁니다.


        마. 테스트

        스프라이트 로드, 머터리얼 로드, 스프라이트 언로드, 머터리얼 언로드 순으로 버튼을 눌러 확인합니다. 

        Addressables Events Viewer 가 작동 안하시는 분들은 Clear 버튼을 한번 눌러주세요.

        숫자 1이 현재 메모리에 올라간 수이다.

        언로드를 눌러서 메모리에서 에셋이 내려간 것을 확인합니다. 에셋이 내려갔어도 인스턴트화된 게임 오브젝트에는 아무런 변화가 없는 것도 확인합니다. 

        저작자표시 (새창열림)

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

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

        티스토리툴바