【Unity】生成AB包,加载AB包

一、描述

1、Unity中可以将模型、地形、动画、贴图、shader等之类的资源加载成 AssetBundle 
2、AssetBundle 是一种资源压缩包
3、使用AB包可以减小安装包的大小,资源可以在进入游戏的初始时进行网络下载或者更新
4、具体的AssetBundle 相关细节知识可百度查询,这里边我只介绍怎么用代码实现生成AB包和加载AB包

二、生成 AssetBundle(AB) 包

  • 首先,将模型或者地形拖成prefab,动画、shader、UI等资源不需要拖成prefab
  • 选中需要打包的资源,点击unity菜单栏——Tools——打包工具
  • 弹出打包界面后选择【打包】按钮即可,最终生成.p的AB包,位置在【StreamingAssets/Dabao/】
    请添加图片描述
    请添加图片描述

三、加载 AssetBundle(AB) 包

加载AB包之前
如果是本地加载,则可以把需要加载的AB包提前放在指定文件夹中(需要和代码中设置的路径一致);
如果是远端加载,则可以直接从远端下载到本地,然后再加载
视情况而定,本文用的是直接从本地文件夹中加载

测试脚本【TestLoadModel.cs】

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

public class TestLoadModel : MonoBehaviour
{
    
    /// <summary>
    /// 所加载的AB的父物体
    /// 可根据自己的项目情况调整
    /// </summary>
    public GameObject equipParent;
    
    void Start()
    {
        LoadMode("JDModel",LoadOverStartEvent);
        //LoadMode("XXX路", "XXX装备", LoadOverStartEvent);
    }

    /// <summary>
    /// 加载建筑物
    /// </summary>
    /// <param name="buildName"></param>
    /// <param name="finish"></param>
    private void LoadMode(string buildName, Action finish)
    {
        int index = 1;
        ResourcesLoadABManager.LoadAssetBundlesAnimAsync(buildName, "", BundleType.Build, (assetBundleObject) =>
        {
            GameObject obj = null;
            if (assetBundleObject != null)
            {
                AssetBundle assetBundle = assetBundleObject.assetBundleCreateRequest.assetBundle;
                string[] strs = assetBundleObject.assetBundleCreateRequest.assetBundle.GetAllAssetNames();
                obj = Instantiate(assetBundle.LoadAsset<GameObject>(strs[0]));
                obj.transform.parent = equipParent.transform;
                index--;
                if (index == 0)
                {
                    finish?.Invoke();
                }
            }
        });
    }
    
    
    /// <summary>
    /// 加载模型、地形
    /// </summary>
    /// <param name="terrainName"></param>
    /// <param name="equipName"></param>
    /// <param name="finish"></param>
    private void LoadMode(string terrainName, string equipName, Action finish)
    {
        int index = 2;
        ResourcesLoadABManager.LoadAssetBundlesAnimAsync(terrainName, "", BundleType.Terrain,
            (assetBundleObject) =>
            {
                Debug.LogError("加载场景中......");
                Debug.LogError("场景名称" + terrainName);
                GameObject obj1 = null;
                if (assetBundleObject != null)
                {
                    AssetBundle assetBundle = assetBundleObject.assetBundleCreateRequest.assetBundle;
                    string[] strs = assetBundleObject.assetBundleCreateRequest.assetBundle.GetAllAssetNames();
                    obj1 = Instantiate(assetBundle.LoadAsset<GameObject>(strs[0]));
                    index--;
                    if (index == 0)
                    {
                        finish?.Invoke();
                    }
                }
            });

        ResourcesLoadABManager.LoadAssetBundlesAnimAsync(equipName, "", BundleType.Equip,
            (assetBundleObject) =>
            {
                Debug.LogError("加载模型中......");
                Debug.LogError("模型名称" + equipName);
                GameObject obj = null;
                if (assetBundleObject != null)
                {
                    AssetBundle assetBundle = assetBundleObject.assetBundleCreateRequest.assetBundle;
                    string[] strs = assetBundleObject.assetBundleCreateRequest.assetBundle.GetAllAssetNames();
                    obj = Instantiate(assetBundle.LoadAsset<GameObject>(strs[0]));
                    obj.transform.parent = equipParent.transform;

                    Vector3 equip_position = new Vector3(-326.505f, 37.688f, 1875.078f);
                    Vector3 rotation = new Vector3(0f, 353.297f, 0f);
                    
                    obj.transform.position = equip_position;
                    obj.transform.eulerAngles = rotation;
                    
                    index--;
                    if (index == 0)
                    {
                        finish?.Invoke();
                    }
                }
            });
    }

    /// <summary>
    /// 加载AB包后开始执行事件
    /// </summary>
    private void LoadOverStartEvent()
    {
        Debug.LogError("加载AB包完成,开始事件......");
        // TODO...
        
    }
}

相关链接

链接:https://pan.baidu.com/s/1a-dKySaisWP2zDTl9pmFIw?pwd=0q58
提取码:0q58
–来自百度网盘超级会员V7的分享

链接:https://pan.baidu.com/s/1FUJMMUIyfUJPiGOpChUcuw?pwd=g3m4
提取码:g3m4
–来自百度网盘超级会员V7的分享

  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Unity 中,可以通过以下步骤下载 Asset Bundle 并加载: 1. 首先需要有一个远程 Asset Bundle 的 URL 地址。 2. 在 Unity 中创建一个空的 GameObject,并为其添加一个脚本。 3. 在脚本中使用 UnityWebRequest 类来下载远程 Asset Bundle,并保存到本地。 示例代码: ```c# UnityWebRequest www = UnityWebRequestAssetBundle.GetAssetBundle("http://www.example.com/example.unity3d"); yield return www.SendWebRequest(); if (www.isNetworkError || www.isHttpError) { Debug.Log(www.error); } else { // 保存至本地 AssetBundle assetBundle = DownloadHandlerAssetBundle.GetContent(www); assetBundle.LoadAllAssets(); // 将 Asset Bundle 保存至本地 File.WriteAllBytes(Application.persistentDataPath + "/example.unity3d", www.downloadHandler.data); } ``` 4. 在需要加载 Asset Bundle 的地方使用 AssetBundle.LoadFromFile() 方法加载本地 Asset Bundle。 示例代码: ```c# AssetBundle assetBundle = AssetBundle.LoadFromFile(Application.persistentDataPath + "/example.unity3d"); GameObject go = assetBundle.LoadAsset<GameObject>("example"); Instantiate(go); ``` 这个例子中,我们通过 AssetBundle.LoadFromFile() 方法加载了本地的 Asset Bundle,并使用其中的一个 GameObject 进行实例化。 需要注意的是,Asset Bundle 的加载顺序很重要,必须先加载依赖项后才能加载主 Asset Bundle。可以使用 AssetBundle.LoadFromFileAsync() 方法异步加载 Asset Bundle,以避免阻塞主线程。同时,为了避免重复下载和浪费带宽,可以使用 AssetBundleManifest 来检查本地是否已经存在所需的 Asset Bundle。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

趙銭孫李

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值