Unity AssetBundle-Verpackungsgrube

Dieser Artikel führt eine relativ umfassende Analyse aller Aspekte der AssetBundle-Verpackung, -Nutzung, -Verwaltung und -Speichernutzung durch und bietet Anleitungen und Anleitungen zum Beheben einiger Fallstricke bei der Verwendung von AssetBundle!
AssetBundle ist die von Unity empfohlene Ressourcenverwaltungsmethode. Die offizielle Liste listet Vorteile wie Hot-Update, Komprimierung, Flexibilität usw. auf. Die Tiefe von AssetBundle ist jedoch sehr tief. Es gibt viele versteckte Details, bei deren Verwendung Sie sehr vorsichtig sein müssen , und Sie werden hineinfallen, wenn Sie nicht aufpassen. Tiefe Grube, Verpackung ist nicht gut geplant, 20 MB-Ressourcen werden auf 30 MB „komprimiert“, oder eine große Anzahl von Paketen führt zu verschiedenen Ineffizienzen beim Packen und Laden oder zu unerklärlichen Verlusten Assoziation oder Speicherexplosion und verschiedene Ladefehler. Ich habe viele Artikel über AssetBundle online studiert, aber jedes Mal, wenn ich sie lese, habe ich immer noch viele Fragen, sodass ich die Fragen in meinem Kopf nur durch Übung beantworten kann. Um die Genauigkeit der Ergebnisse sicherzustellen, wird der folgende Test unter dem Editor Windows durchgeführt. Tests und Vergleiche wurden unter IOS durchgeführt.
Warum sollten Sie sich zunächst für AssetBundle entscheiden? Auch wenn es verschiedene Vorteile bietet, besteht der allgemeine Grund für die Wahl von AssetBundle darin, Hot-Updates durchzuführen, Spielressourcen dynamisch zu aktualisieren, oder die Ressourcen unter Ihrer Ressource überschreiten ihr Limit (2 GB oder 4 GB?). Wenn Sie kein solches Bedürfnis haben, empfehle ich Ihnen, dieses schlechte Ding nicht zu verwenden, es ist nervig~~
Nachdem Sie AssetBundle ausgewählt haben und bevor ich mit dem Sprühen von AssetBundle beginne, müssen wir eine kurze Einführung in den Workflow von AssetBundle geben:
AssetBundle kann in das Verpacken von AssetBundle und die Verwendung von AssetBundle unterteilt werden
Beim Verpacken müssen Sie unter UnityEditor einen einfachen Code schreiben, um die Ressourcen herauszunehmen, die Sie verpacken möchten, und dann die Verpackungsmethode zum Verpacken aufrufen.
Wenn Sie es verwenden, müssen Sie WWW verwenden, um das Bundle zu laden, und dann das geladene Bundle zum Laden von Ressourcen verwenden.
WWW w = new WWW("file://" + Application.streamingAssetsPath + "/Test.assetbundle"); myTexture = w.assetBundle.Load("Test")
【1. Verpackung】
Werfen wir als nächstes einen Blick auf die Verpackung:
1. Sammlung von Ressourcen
Vor dem Packen können wir automatisch packen, indem wir das Verzeichnis durchlaufen. Wir können einige Verzeichnisse selektiv in ein Bundle packen. Wir können auch verschiedene Konfigurationsdateien zum Verwalten von Ressourcen verwenden und wir können auch Verzeichnisspezifikationen verwenden, um dies zu verwalten.
Ich verwende eine Verzeichnisspezifikation, um Ressourcen in mehrere große Module zu klassifizieren: öffentlich, im Spiel und außerhalb des Spiels, und verwende dann eine Reihe einfacher Benennungsspezifikationen, um die Paketierung zu steuern, z. B. die Verwendung von OBO (OneByOne) als Verzeichnissuffix. Leitfaden um alle Ressourcen im Verzeichnis unabhängig zu packen. Standardmäßig werden sie in ein Paket gepackt. Verwenden Sie das Basispräfix, um anzugeben, dass es sich um ein öffentliches Paket handelt. Andere Verzeichnisse im selben Verzeichnis müssen davon abhängig sein.
Verwenden Sie GetFiles und GetDirectories von Directory, um das Verzeichnis und die Dateien im Verzeichnis einfach abzurufen.
Directory.GetFiles("Assets/MyDirs", "*.*", SearchOption.TopDirectoryOnly); Directory.GetDirectories(Application.dataPath + „/Resources/Game“, „*.*“, SearchOption.AllDirectories)
2. Lesen von Ressourcen
GetFiles搜集到的资源路径可以被加载,加载之前需要判断一下后缀是否.meta,如果是则不取出该资源,然后将路径转换至Assets开头的相对路径,然后加载资源
tring newPath = "Assets" + mypath.Replace(Application.dataPath, ""); newPath = newPath.Replace("\\", "/"); Object obj = AssetDatabase.LoadMainAssetAtPath(newPath)
3.打包函数
我们调用BuildPipeline.BuildAssetBundle来进行打包:
BuildPipeline.BuildAssetBundle有5个参数,第一个是主资源,第二个是资源数组,这两个参数必须有一个不为null,如果主资源存在于资源数组中,是没有任何关系的,如果设置了主资源,可以通过Bundle.mainAsset来直接使用它
第三个参数是路径,一般我们设置为  Application.streamingAssetsPath + Bundle的目标路径和Bundle名称
第四个参数有四个选项,BuildAssetBundleOptions.CollectDependencies会去查找依赖,BuildAssetBundleOptions.CompleteAssets会强制包含整个资源,BuildAssetBundleOptions.DeterministicAssetBundle会确保生成唯一ID,在打包依赖时会有用到,其他选项没什么意义
第五个参数是平台,在安卓,IOS,PC下,我们需要传入不同的平台标识,以打出不同平台适用的包,注意,Windows平台下打出来的包,不能用于IOS
在打对应的包之前应该先选择对应的平台再打包
4.打包的决策
在打包的时候,我们需要对包的大小和数量进行一个平衡,所有资源打成一个包,一个资源打一个包,都是比较极端的做法,他们的问题也很明显,更多情况下我们需要灵活地将他们组合起来
打成一个包的缺点是加载了这个包,我们不需要的东西也会被加载进来,占用额外内存,而且不利于热更新
打成多个包的缺点是,容易造成冗余,首先影响包的读取速度,然后包之间的内容可能会有重复,且太多的包不利于资源管理
哪些模块打成一个包,哪些模块打成多个包,需要根据实际情况来,例如游戏中每个怪物都需要打成一个包,因为每个怪物之间是独立的,例如游戏的基础UI,可以打成一个包,因为他们在各个界面都会出现
PS.想打包进AssetBundle中的二进制文件,文件名的后缀必须为“.bytes”
【二,解包】
【二,解包】
tring.Format("file://{0}/{1}", Application.streamingAssetsPath, bundlePath)
在安卓下路径不一样,如果是安卓平台的本地Bundle,需要用jar:file://作为前缀,并且需要设置特殊的路径才能加载
tring.Format("jar:file://{0}!/assets/{1}", Application.dataPath, bundlePath)
传入指定的URL之后,我们可以用WWW来加载Bundle,加载Bundle需要消耗一些时间,所以我们一般在协同里面加载Bundle,如果加载失败,你可以在www.error中得到失败的原因

Supongo que te gusta

Origin blog.csdn.net/qq_25189313/article/details/77930340
Recomendado
Clasificación