AssetBundle WorkFlow
AB工作流程 官方给了8 个步骤+
AB 是 AssetBundle是简称,资产包
1,选择您想要从项目视图中分配给捆绑包的资产
2,检查 属性面板的对象
3,在属性面板的底部,分配资产约束 和变体的部分 如下图
4,从 下拉列表中,左边是资产集,右边分配变量
5,单击左边的下拉框,其中显示“None”,以显示当前注册的AB名称
6,点击左边 下拉框,单击New 创建一个新的AB
7,输入所需的AssetBundle名称。请注意,AssetBundle名称确实支持一种类型的文件夹结构,这取决于您键入的内容。若要添加子文件夹,请以“/”分隔文件夹名称。例如:AssetBundle name“environment/forest”将在环境子文件夹下创建一个名为forest的包
8,一旦您选择或创建了一个AssetBundle名称,如果您愿意,您可以对右侧下拉菜单重复这个过程来分配或创建一个变体名称。构建时不需要变量名
的AssetBundles
//Build the AssetBundles
//Create a folder called Editor in the Assets folders, and place a script with the //following contents in the folder:
using UnityEditor;
public class CreateAssetBundles
{
[MenuItem("Assets/Build AssetBundles")]
static void BuildAllAssetBundles()
{
string assetBundleDirectory = "Assets/AssetBundles";
if(!Directory.Exists(assetBundleDirectory))
{
Directory.CreateDirectory(assetBundleDirectory);
}
BuildPipeline.BuildAssetBundles(assetBundleDirectory, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
}
}
上面的脚本 创建一个菜单选项栏 ,点击之后就会出现一个进度条,并显示一个Build对话框。这将获取您标记为AssetBundle名称的所有资产,并将它们放在由assetBundleDirectory定义的路径的文件夹中。
上传AB包到外部 云服务器
这个步骤对每个用户都是唯一的,而不是一个步骤统一可以告诉你怎么做。如果您计划将您的资产包上传到第三方托管站点,请在这里完成。如果您正在进行严格的本地开发,并且打算将所有资产束放在磁盘上,那么请跳到下一个步骤。
加载 AB包和 Assets
从本地储存加载数据的用户 看 LoadFromFile APIhttps://docs.unity3d.com/ScriptReference/AssetBundle.LoadFromFile.html
public class LoadFromFileExample extends MonoBehaviour {
function Start() {
var myLoadedAssetBundle = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "myassetBundle"));
if (myLoadedAssetBundle == null) {
Debug.Log("Failed to load AssetBundle!");
return;
}
var prefab = myLoadedAssetBundle.LoadAsset.<GameObject>("MyObject");
Instantiate(prefab);
}
}
主机 下载 AB包
如果你自己托管你的资产包,并且需要把它们下载到你的游戏中,你会对UnityWebRequest API感兴趣。这里有一个例子:
https://docs.unity3d.com/ScriptReference/Networking.UnityWebRequest.html
IEnumerator InstantiateObject()
{
string uri = "file:///" + Application.dataPath + "/AssetBundles/" + assetBundleName;
UnityEngine.__Networking__.UnityWebRequest request = UnityEngine.__Networking__.UnityWebRequest.GetAssetBundle(uri, 0);
yield return request.Send();
AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request);
GameObject cube = bundle.LoadAsset<GameObject>("Cube");
GameObject sprite = bundle.LoadAsset<GameObject>("Sprite");
Instantiate(cube);
Instantiate(sprite);
}
GetAssetBundle(string, int)获取AssetBundle位置的uri和要下载的bundle的版本。在本例中,我们仍然指向一个本地文件,但是字符串uri可以指向您托管资产束的任何url。
UnityWebRequest有一个专门处理资产束的句柄DownloadHandlerAssetBundle,它从请求中获取资产束。
无论使用什么方法,您现在都可以访问AssetBundle对象。从该对象中,您需要使用LoadAsset<T>(string),它接受您要加载的资产的类型T,以及对象的名称作为绑定包中的字符串。这将返回您从AssetBundle加载的任何对象。您可以使用这些返回的对象,就像Unity中的任何对象一样。例如,如果你想在场景中创建一个GameObject,你只需要调用Instantiate(gameObjectFromAssetBundle)。
https://docs.unity3d.com/Manual/AssetBundles-Workflow.html官方APi
https://docs.unity3d.com/Manual/AssetBundles-Browser.html AB包 插件
压缩算法的选择https://blog.csdn.net/tc3819171/article/details/80317113