Asset Bundle

版权声明:转载 请说明 https://blog.csdn.net/qq2512667/article/details/82148639

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

猜你喜欢

转载自blog.csdn.net/qq2512667/article/details/82148639