그냥 Adresable 맛있는 데로?Scriptable Build Pipline 있잖아요.

이 글은 AssetBundle의 기본 지식을 소개하지 않습니다.
이것은 이미 AssetBundle을 사용한 사람들을 대상으로 한 보도입니다.

자산 시스템을 조정할 수 있는 새로운 기능


현재 자산이 구축에서 추출한 자산의 귀속을 더욱 쉽게 처리할 수 있는 시스템이 생겼다.
https://blogs.unity3d.com/jp/2019/07/15/addressable-asset-system/
  • 임의의 문자열로 AssetBundle에서 자산을 간단하게 불러올 수 있습니다
  • AssetBundle의 의존 관계 해결에 대한 처리도 준비되었다
  • AssetBunlde의 요약 방법은 편집기를 조정할 수 있습니다
  • 구성 프로그램을 통해 읽기 상황을 확인할 수 있습니다
  • 의 규격화 거리의 멱 함수.

    지금 AssetBundle을 가져올 필요가 있는 사람은 우선 고려해야 할 선택
  • 만든 지 얼마 되지 않아 불안하게 사용하고 싶지 않다
  • 기존의 자체 제작 프로그램 라이브러리에서 운용한다
  • 자체 제작 라이브러리가 더 편리합니다
  • Adressable의 구조가 일치하지 않습니다
  • 등의 이유로 Adressable Asset System을 사용하지 않는 사람도 있을 것 같습니다.
    하지만 Adresable Asset System에서는 할 수 있지만 그 중에는 오래된 Unity에서는 할 수 없는 기능이 몇 개 있다.개인적으로 가장 원하는 기능은 Built InShader의 기능을 분리하는 것입니다.

    왜 건물을 분리합니까 InShader


    Unity5에서 가져온 이 방법은 AssetBundle 이름의 자산을 사전에 분배한 자산을 수집하여 간단하게 AssetBunlde를 만들지만 너무 세밀하게 통제할 수 없다.
    쉽게 할 수 있지만 다른 한편으로는 자세히 조사하지 않으면 함정을 눈치채지 못해 성능이 악화될 수 있다.

    동일한 리소스를 여러 리소스 그룹에 중복 저장


    구축 과정에서 겪는 문제 중 하나는 같은 데이터가 몇 개의 AssetBundle에 중복적으로 들어간다는 것이다.
    (↑ 새로운 렌더링 텍스쳐가 각각 4개의 material AssetBundle에 포함된 모습)
    일부 Prefab(예: 텍스쳐, 재료 또는 재료)에 사용된 리소스에 AssetBundle 이름을 잘못 지정했다가 잊어버리면 이렇게 됩니다.AssetBundle은 의존 관계를 구축할 수 있기 때문에 공동으로 사용하는 자원에 대해서도 AssetBundle 이름을 잘 설정하면 기본적으로 피할 수 있다.
    그러나 이때 AssetBundle 이름을 도저히 설정할 수 없는 어려운 자산이 있습니다.바로 유니티에 편입된 Built InAsset입니다.프로젝트 보기에 표시되지 않기 때문에 자산 귀속 이름을 지정할 수 없습니다. 이 이름을 인용한 모든 자원 귀속은 단독 자원으로 중복 저장됩니다.

    Built InShader는 모바일 버전의 천적입니다.


    이런 BuiltInAsset에서는 재질구의 존재가 더 나빠진다.런타임 시 재료 공을 처음 사용할 때 재료 공을 컴파일하지만 위의 문제에서 반복된 재료 공은 다른 것으로 간주되기 때문에 매번 컴파일됩니다.특히 자주 사용하는 셰이더(예를 들어 UI-Default와 Standered Shader)는 지옥과 같을 수도 있다.(주1)

    이 문제를 피하기 위해 일부러 Default UI의 Shader와 소재를 바꾸거나 Built InShader를 철저히 사용하지 않는 등 고통스러운 대응도 있었다고 생각합니다.(주2)
    오프닝이 길어졌지만 이 문제를 쉽게 해결할 수 있는 것은 신축 가능한 Build Pipline이다.
    주1) 원래 Unity도 처음에 몇 개의 패치 파일을 만드는 것만 고려했을 뿐, AssetBundle을 엉망진창으로 나눌 생각은 없었을 것이다.Soshage의 운용을 예상하지 못했을 수도 있고, 대량의 자산을 빈번하게 갱신할 수 있다
    주2) 더 똑똑한 방법이 있을지도 모른다

    검색 가능한 Build Pipline(SBP) 사용


    솔직히 말하자면 Scriptable Build Pipline은 Addressable Asset System을 제작할 때 기존의 AssetBundle 구축 시스템의 한계성을 알아차리고 만든 복산물로 Adressable 구축 시스템에 필요한 기능을 추가했다.
    (Asset을 로드할 때 이름을 마음대로 변경할 수 있음)
    자세한 설명은 테라슈어 블로그를 이해하기 쉽고 간단하게 설명하면 SBP를 사용하여 AssetBundle의 구축 처리 작업을 자유롭게 제작하고 사용자 정의할 수 있습니다.

    DefaultBuildTasks.Preset.AssetBundleBuiltInShaderExtraction


    그리고 포럼 관계자의 대답을 보면 기대했던 기능이 준비되어 있다는 것을 알 수 있다.SBP가 구축한 처리 샘플은 다음과 같습니다.
    public static class BuildAssetBundlesExample
    {
       public static bool BuildAssetBundles(string outputPath, bool useChunkBasedCompression, BuildTarget buildTarget, BuildTargetGroup buildGroup)
       {
           var buildContent = new BundleBuildContent(ContentBuildInterface.GenerateAssetBundleBuilds());
           var buildParams = new BundleBuildParameters(buildTarget, buildGroup, outputPath);
    
           if (useChunkBasedCompression)
               buildParams.BundleCompression = BuildCompression.DefaultLZ4;
    
           IBundleBuildResults results;
            var tasks = DefaultBuildTasks.Create(DefaultBuildTasks.Preset.AssetBundleBuiltInShaderExtraction);
           ReturnCode exitCode = ContentPipeline.BuildAssetBundles(buildParams, buildContent, out results, tasks);
           return exitCode == ReturnCode.Success;
       }
    }
    
    "기본 구축 작업"Preset을 제공하는 기능에서 AssetBundleBuiltInShaderExtraction의 맞춤형 작업을 제공합니다!
    var tasks = DefaultBuildTasks.Create(DefaultBuildTasks.Preset.AssetBundleBuiltInShaderExtraction);
    
    특히 중요한 것은 C reateBuilt InShaders Bundle입니다.cs에 기록된 처리이지만 Built InAsset을 찾아 다른 Asset Bundle에 합친 처리의 예시 코드가 적혀 있습니다.
    실제로 이 방법으로 구축하면 Unity Built InShaders.BuiltInShader를 다시 로드하지 않고 bundle을 생성합니다.
    AssetBundleBrawser에서 볼 때 AssetBundle에서 BuiltInShader에 대한 참조가 중단된 것을 볼 수 있습니다.

    이 SBP는 Adressable을 사용하지 않아도 사용할 수 있는 패키지이기 때문에 기존 AssetBundle을 관리하는 라이브러리가 있는 사람이라도 가져올 수 있습니다.

    하지만 AssetBundle Manifest는 지원되지 않습니다.


    하지만 불행히도 Default Build Tasks는 AssetBundle Manifest를 지원하지 않습니다.
    (부분 발췌문) DefaultBuildTasks.cs
    buildTasks.Add(new PostWritingCallback());
    
    // Generate manifest files
    // TODO: IMPL manifest generation
    
    return buildTasks;
    
    Manifest의 Adressable을 사용하지 않기 위해 준비한 기능이기 때문에 Manifest를 만드는 기능이 늦어지는 것은 어쩔 수 없지만 Manifest가 없으면 의존적인 AssetBundle을 찾을 수 없습니다.

    매니페스트 대신 IBundleBuildResults에서 직접 제작


    실제로 Manifest를 로드하지 않아도 종속 관계가 있는 AssetBundle을 가져올 수 있습니다.매니페스트는 의존 관계가 있는 AssetBundle을 얻는 방법만 준비했기 때문에 그 목록을 직접 만들면 대체할 수 있다.
    다행인 것은 ContentPipeline입니다.BuildAssetBundles의 IBundleBuildResults에 구축된 결과가 기재되어 있기 때문에 사용합니다.
    interface IBundleBuildResults {
        Dictionary<string, BundleDetails> BundleInfos { get; }
    }
    
    class BundleDetails {
            public string FileName {get; set;}
            public uint Crc {get; set;}
            public Hash128 Hash {get; set;}
            public string[] Dependencies {get; set;}
    }
    
    이 result에서 BundleInfos 서열화를 파일에 저장하면 AssetBundleManifest입니다.GetAllDependencies와 같은 기본 대체 방법을 제공하는 클래스는 스스로 만들 수 있습니다.

    AssetName을 파일 경로로 수정


    자체 제작 Manifest를 통해 리소스를 로드하는 데 필요한 모든 AssetBundle을 가져올 수 있습니다.그러나 이전 Unity의 AssetBundle을 로드할 때 리소스를 로드하는 데 필요한 문자열은 리소스의 파일 이름이지만 SBP는 기본적으로 파일 경로입니다.
    이 작업을 취소하려면 BundleBuildContent의 Addresses를 변경해야 합니다.
    var buildContent = new BundleBuildContent(ContentBuildInterface.GenerateAssetBundleBuilds());
    //GC気になる人は適宜直してね
    foreach (var adress in buildContent.Addresses.Keys.ToList())
    {
        buildContent.Addresses[adress] = System.IO.Path.GetFileName(buildContent.Addresses[adress]);
    }
    
    
    Addresses Key는 GUID이고 Value는 파일 경로이므로 파일 이름으로 바꾸면 파일 이름인 AssetBundle을 사용합니다.이제 로딩을 사용할 수 있습니다.
    매니페스트와 AssetName이 많이 바뀌었지만, 여기에 맞춤 제작이 가능하다면 기존의 AssetBundle 라이브러리에서도 SBP를 사용할 수 있지 않을까요?(주3)
    주3) Ignore Type Tree Change는 현재 지원되지 않는 것 같습니다. 안 되면 힘들 수도 있습니다.

    총결산


    이번에 우리는 SBP를 도입하여 Built InShader를 분리하려고 시도했지만 Default Build Task 자체 제작 Task를 참고하여 상당히 자유로운 AssetBundle 구축 파이프라인을 구축할 수 있다.
  • 차분 구축에서 변경된 AssetBundle을 추출하고 싶습니다
  • 다른 프로젝트의 AssetBundle과 조합하여 운용하고 싶습니다
  • 구축하기 전에 파일을 바꾸고 싶습니다
  • 구축하기 전에 암호화하여 AssetBundle에 넣고 싶습니다
  • 잠깐만, 내 생각에는 괜찮을 것 같아.

    좋은 웹페이지 즐겨찾기