Unity中AssetBundle的变体(Varient)使用教程

这篇具有很好参考价值的文章主要介绍了Unity中AssetBundle的变体(Varient)使用教程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在使用Unity的AssetBundle过程中,选中资源物体之后,发现右下角的AssetBundle面板,除了有一个命名标签外,还有一个Varient标签,这边文章主要介绍下这个标签的用法,如下图:
assetbundle 变体,游戏开发,c#,Unity,游戏,AssetBundle,Unity

使用举例:

  • 多语言:在做游戏开发的过程中,会遇到多语言问题,特别是现在推行的游戏全球化,所以支持多语言是必须要做的。
  • 适配机型:对于不同档次的移动设备,需要使用不同的资源,比如模型的面数、shader的简易程度等,需要用到不同的资源。

这里我用的Unity版本是2019.4.4,使用了AB包管理插件AssetBundle Browser ,这个可以直接在Windows ->PackageManager里面找到此插件并直接安装,这里以多语言为例,做一个简单的示范。
首先在Asset目录下新建一个文件夹放置AB包的资源,这个文件夹只要不命名为Resources就行(Resouces是Unity默认的资源防止路径,打包的时候会全部一起打包,使用其中的资源时,会一起加载进内存,导致内存增大);如下图所示:
assetbundle 变体,游戏开发,c#,Unity,游戏,AssetBundle,Unity
这两个示例文件夹下面放置的是对应中文和英文UI prefab的资源;接着选中对应的资源,在Inspector面板的AssetBundle位置处,设置Assetbundle Name 和Assetbundle Varient,下图分别是设置中文和英文同样UI的示意图:

中文UI资源的设置

assetbundle 变体,游戏开发,c#,Unity,游戏,AssetBundle,Unity

英文UI资源的设置

assetbundle 变体,游戏开发,c#,Unity,游戏,AssetBundle,Unity
之后,选中菜单栏的Windows->AssetBundle Brower,打开设置界面,选中Build栏:
assetbundle 变体,游戏开发,c#,Unity,游戏,AssetBundle,Unity
打包成功之后,会在StreamingAssets目录生成对应的AB资源:
assetbundle 变体,游戏开发,c#,Unity,游戏,AssetBundle,Unity
然后我们可以在脚本中验证下加载的效果,简单说,就是实现多语言的切换

示例代码

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

public class ABLoadTest : MonoBehaviour
{
    private Dictionary<string, AssetBundle> abCache;
    private AssetBundle mainAB = null; //主包
    private AssetBundleManifest mainManifest = null; //主包中配置文件---用以获取依赖包
    private string language;
    GameObject cur_panel;
    AssetBundle ab;


    private string basePath
    {
        get
        {
#if UNITY_EDITOR || UNITY_STANDALONE
            return Application.dataPath + "/StreamingAssets/";
#elif UNITY_IPHONE
                return Application.dataPath + "/Raw/";
#elif UNITY_ANDROID
                return Application.dataPath + "!/assets/";
#endif
        }
    }

    string curabName
    {
        get { return "ui1." + language; }
    }

    void Start()
    {
        language = "en";
        abCache = new Dictionary<string, AssetBundle>();

        ab = LoadABTest();
        GameObject model = ab.LoadAsset<GameObject>("Canvas");
        cur_panel = Instantiate<GameObject>(model);
        // dosomething


    }

    AssetBundle LoadABTest()
    {
        string abName = curabName;
        if (mainAB == null)
        {
            mainAB = AssetBundle.LoadFromFile(basePath + "StandaloneWindows");
            mainManifest = mainAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");

        }
        //根据manifest获取所有依赖包的名称 固定API
        string[] dependencies = mainManifest.GetAllDependencies(abName);
        //循环加载所有依赖包
        for (int i = 0; i < dependencies.Length; i++)
        {
            //如果不在缓存则加入
            if (!abCache.ContainsKey(dependencies[i]))
            {
                //根据依赖包名称进行加载
                ab = AssetBundle.LoadFromFile(basePath + dependencies[i]);
                //注意添加进缓存 防止重复加载AB包
                abCache.Add(dependencies[i], ab);
            }
        }
        //加载目标包 -- 同理注意缓存问题
        if (abCache.ContainsKey(abName))
        {
            Debug.Log($"have load {abName}");
            return abCache[abName];
        }
        else
        {
            ab = AssetBundle.LoadFromFile(basePath + abName);
            abCache.Add(abName, ab);
            Debug.Log($"new load {abName}");
            return ab;
        }
    }

    // Update is called once per frame
    void Update()
    {
        if(Input.GetKeyDown(KeyCode.A)) // 同步加载
        {
            if(language != "zh")
            {
                if (cur_panel != null)
                {
                    cur_panel.SetActive(false);
                    Destroy(cur_panel);
                }
                UnLoad(curabName);
                language = "zh";
                ab = LoadABTest();
                GameObject model = ab.LoadAsset<GameObject>("Canvas");
                cur_panel = Instantiate<GameObject>(model);
            }

        }
            
        else if (Input.GetKeyDown(KeyCode.S))// 异步加载
        {
            if (language != "en")
            {
                if (cur_panel != null)
                {
                    cur_panel.SetActive(false);
                    Destroy(cur_panel);
                }
                UnLoad(curabName);
                language = "en";
                ab = LoadABTest();
                GameObject model = ab.LoadAsset<GameObject>("Canvas");
                cur_panel = Instantiate<GameObject>(model);
            }

        }
        else if (Input.GetKeyDown(KeyCode.D))// 单个卸载
        {
            string abName = "testuipanel0." + language;
            UnLoad(abName);
            Debug.Log("have UnLoadAll 3dmodel.first");

        }
        else if (Input.GetKeyDown(KeyCode.F))// 全部卸载
        {
            UnLoadAll();
            Debug.Log("have UnLoadAll");
        }

    }

    private IEnumerator LoadResAsyncTest(AssetBundle ab)
    {
        if (ab == null) yield return null;
        string abName = "testuipanel0." + language;
        var model1 = ab.LoadAssetAsync<GameObject>(abName);
        yield return model1;
        var cur_panel = Instantiate((GameObject)model1.asset);
        // dosomething
    }

    //====================AB包的两种卸载方式=================
    //单个包卸载
    public void UnLoad(string abName)
    {
        if (abCache.ContainsKey(abName))
        {
            abCache[abName].Unload(false);
            //注意缓存需一并移除
            abCache.Remove(abName);
        }
    }

    //所有包卸载
    public void UnLoadAll()
    {
        AssetBundle.UnloadAllAssetBundles(false);
        //注意清空缓存
        abCache.Clear();
        mainAB = null;
        mainManifest = null;
    }

}

通过按键实现多语言界面的切换


assetbundle 变体,游戏开发,c#,Unity,游戏,AssetBundle,Unity
关于AB包的基础使用文章可以看这篇文章来源地址https://www.toymoban.com/news/detail-558955.html

到了这里,关于Unity中AssetBundle的变体(Varient)使用教程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • [游戏开发][Unity]Assetbundle下载篇(7)获取运行时(边玩边下)下载列表

    [游戏开发][Unity]Assetbundle下载篇(7)获取运行时(边玩边下)下载列表

    打包与资源加载框架目录 啥是运行时下载清单?现在大多数手游都会有一个边玩边下功能,会提示用户是否开启下载,要XXX流量,如果你下载完了,可能还会有奖励。   疑问:为何要有边玩边下功能? 解答:为了发包的包体小,并且是越小越好! 我们的游戏想要赚钱,第一

    2024年02月08日
    浏览(12)
  • [游戏开发][Unity]Assetbundle下载篇(1)热更前准备与下载AB包清单

    [游戏开发][Unity]Assetbundle下载篇(1)热更前准备与下载AB包清单

    打包与资源加载框架目录 热更流程都不是固定的,每个人写的状态机也有所差别,但是一些必要步骤肯定不可能少,例如下载清单,对比版本,下载AB包,标记下载完成。我接下来的每一篇文章都是下载AB包的重要步骤,大概率是不能省略的。 检查沙盒路径是否存在 检查下载

    2024年02月15日
    浏览(13)
  • [游戏开发][Unity]Assetbundle加载篇(4)检查断点续传以及开始下载AB包

    打包与资源加载框架目录 下 载 AB包之前,要检查该AB包是否下载中断过,例如用户杀程序,卡死等情况。 前文有讲解过,下载AB包会先下载到临时文件夹,全部下载成功后,全部剪切到persistentDataPath沙盒目录中。 回顾一下之前的筛选机制,哪些AB包可以加入下载列表,其中并

    2024年02月08日
    浏览(16)
  • [游戏开发][Unity]Assetbundle下载篇(4)检查断点续传以及开始下载AB包

    打包与资源加载框架目录 下 载 AB包之前,要检查该AB包是否下载中断过,例如用户杀程序,卡死等情况。 前文有讲解过,下载AB包会先下载到临时文件夹,全部下载成功后,全部剪切到persistentDataPath沙盒目录中。 回顾一下之前的筛选机制,哪些AB包可以加入下载列表,其中并

    2024年02月09日
    浏览(13)
  • Unity中使用AssetBundle打包与加载的注意事项

    Unity中使用AssetBundle打包与加载的注意事项

    一、使用AssetBundle进行打包与加载 个人觉得可以参考以下两篇博客,这个网上相关教程很多,还不明白的可以去百度,或者给我留言。 Unity 打包与加载AssetBundle(加载对应的依赖) Unity中的AssetBundle 二、使用AssetBundle进行加载的时候注意事项: 注意事项一:AssetBundle名字和设置

    2024年02月11日
    浏览(10)
  • 2023-06-08 Unity AssetBundle1——AB包介绍与使用

    一、AB 包介绍 ​ AB 包是特定于平台的资源压缩包,类似于压缩文件。其中资源可包括:模型、贴图、预设体、音效、材质球等等。 ​ 相较于 Resources 文件夹下的资源文件,AB 包能够更好管理资源: Resources 文件夹:打包时资源固定,只读,无法修改。 AB 包:存储位置可自定

    2024年02月16日
    浏览(13)
  • 【游戏提取/超详细记录向】关于unity游戏的资源提取所需资源及方法简介(AssetBundle及libil2cpp.so等解密)

    方法一 :AssetStudio提取(仅针对ab包及.assets、.boundle和.unity3d未加密的情况下) 1.在我们拿到一个游戏的安装包时,首先会疑惑如何打开。下载bandzip Bandizip · Free zip, 7z, unzip, unrar Archiver · Fast and easy ,这是一款非常方便的解压缩工具。安装后右键apk-压缩文件预览,即可打开

    2023年04月15日
    浏览(9)
  • 【Unity学习笔记】AssetBundle

    【Unity学习笔记】AssetBundle

    AssetBundle是Unity提供的一种用于存储资源的压缩集合,它可以存储任何一种Unity可以识别的资源,如模型,纹理图,音频,场景等资源。也可以加载开发者自定义的二进制文件。 Resources打包时会将所有的资源统统打包到Resources中,这意味着即使你只想要其中的部分资源,也需要

    2024年02月16日
    浏览(13)
  • 【Unity】AssetBundle

    【Unity】AssetBundle

            稍微写了下AssetBundle(AB包)的笔记。介绍了AB包是什么,以及如何使用的。后续有一部分基本是翻译的官方文档,侧重于概念类的,计划等后续有实际应用时再单独写出来。         AssetBundle是一个存档文件,包含可在运行时由Unity加载的特定于平台的非代码资

    2024年02月03日
    浏览(9)
  • Unity AssetBundle学习笔记

    Unity AssetBundle学习笔记

    目录 基础介绍 动态资源加载 更新和添加内容 打包策略 资源分组 频繁更新的资源 资源压缩 Unload(true)和Unload(false) Unload(false) Unload(true) 确定何时卸载 引用计数 场景和状态管理 资源使用频率 内存预算和监控 用户输入和游戏逻辑 处理依赖关系  依赖管理 使用 AssetBundl

    2024年02月02日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包