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)获取运行时(边玩边下)下载列表

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

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

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

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

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

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

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

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

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

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

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

    2024年02月16日
    浏览(37)
  • 【游戏提取/超详细记录向】关于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日
    浏览(38)
  • 【Unity学习笔记】AssetBundle

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

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

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

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

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

    2024年02月03日
    浏览(31)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包