그냥 Adresable 맛있는 데로?Scriptable Build Pipline 있잖아요.
이것은 이미 AssetBundle을 사용한 사람들을 대상으로 한 보도입니다.
자산 시스템을 조정할 수 있는 새로운 기능
현재 자산이 구축에서 추출한 자산의 귀속을 더욱 쉽게 처리할 수 있는 시스템이 생겼다.
https://blogs.unity3d.com/jp/2019/07/15/addressable-asset-system/
지금 AssetBundle을 가져올 필요가 있는 사람은 우선 고려해야 할 선택
하지만 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.csbuildTasks.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 구축 파이프라인을 구축할 수 있다.
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;
}
}
var tasks = DefaultBuildTasks.Create(DefaultBuildTasks.Preset.AssetBundleBuiltInShaderExtraction);
buildTasks.Add(new PostWritingCallback());
// Generate manifest files
// TODO: IMPL manifest generation
return buildTasks;
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;}
}
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]);
}
이번에 우리는 SBP를 도입하여 Built InShader를 분리하려고 시도했지만 Default Build Task 자체 제작 Task를 참고하여 상당히 자유로운 AssetBundle 구축 파이프라인을 구축할 수 있다.
Reference
이 문제에 관하여(그냥 Adresable 맛있는 데로?Scriptable Build Pipline 있잖아요.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/frost224/items/1860cb675ea7a581b56c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)