Unity--AB包管理插件-xasset

这篇具有很好参考价值的文章主要介绍了Unity--AB包管理插件-xasset。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 基本使用

1. 构建配置文件
1. SplitConfig

创建SplitConfig文件,在xasset目录中选中Settings文件,将创建的SplitConfig文件赋值给对应参数。

2. Group
  1. 创建Group文件,将需要打包的文件和文件夹拖拽到Entries中
  2. Filter过滤器将决定哪些文件会被过滤(例:t:Material)
  3. 设置Bundle Mode,将决定以何种方式构建AB包。
参数 描述
Pack Together 全部达成一个包
Pack By File 以文件打包
Pack By Folder 以文件夹打包
3. Build

创建Build文件,将Group放入Groups菜单中

4. 其他行为

将xasset目录中的Settings文件,Script Play Mode选项卡设置为Inrement,模拟真实AB包读取。(这会导致每次开始运行时提示将数据迁移到streaming asset)文章来源地址https://www.toymoban.com/news/detail-405727.html

2. 打包文件
  1. 点击 xasset->Build Bundles 构建AB包
  2. 点击 xasset->Clear Bundles 清除老的AB包
  3. 默认构建的包体,将被保存到工程目录下(与Assets同级)
3. 代码编写
  1. 预加载
using UnityEngine;
using xasset;
using Scene = xasset.Scene;

public class StartGet : MonoBehaviour
{
    // Start is called before the first frame update
    async void Start()
    {
        if (!Versions.Initialized)
        {
            Versions.VerifyMode = VerifyMode.Size;

            var initialize = Versions.InitializeAsync();
            await initialize.Task;
            if (initialize.status != OperationStatus.Success)
            {
                // TODO: 提示失败
                return;
            }
        }
    }
}
  1. 加载场景文件
var asset = Scene.LoadAsync("Assets/AB/B/SampleScene.unity");
await asset.Task;
  1. 加载资源文件
var asset= Asset.LoadAsync("Assets/AB/A/Room03_carpet_9_0.png", typeof(Sprite));
await asset.Task;
GetComponent<SpriteRenderer>().sprite = asset.asset as Sprite;

2. 网络热更示例

public class GameLauncher : MonoBehaviour
{
     private enum Stage
     {
         Initializing,
         CheckingUpdate,
         Updating,
         CheckingDownload,
         Downloading,
     }

     [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
     private static void InitializeBeforeSceneLoad()
     {
         Application.backgroundLoadingPriority = ThreadPriority.High;
         Application.targetFrameRate = 60;
     }

     private const string LuaModule = "lua_script";

     public Image progressImage;
     public TextMeshProUGUI progressText;

     private Stage _stage = Stage.Initializing;
     private float _time;
     private WeakReference<Tweener> _progressAction;

     [RuntimeInitializeOnLoadMethod]
     private static void InitializeLocalization()
     {
         LanguageMgr.Instance.CustomLoader = language =>
         {
             var path = $"Assets/Localization/lang/{language}.json";
             var asset = Asset.Load(path, typeof(TextAsset));
             if (asset == null)
             {
                 return "{}";
             }

             var ret = Encoding.UTF8.GetString((asset.asset as TextAsset).bytes);
             asset.Release();
             return ret;
         };
     }

     // 不能用Awake,xasset.PathManager在第一个场景加载后初始化
     private void Start()
     {
         Initialize();
     }

     private void ProgressTo(float time, float percent)
     {
         if (_progressAction != null && _progressAction.TryGetTarget(out var tweener))
         {
             tweener.Kill();
         }

         tweener = progressImage.rectTransform.DOSizeDelta(new Vector2((436 - 34) * percent + 34, 42), time);
         _progressAction = new WeakReference<Tweener>(tweener);
     }

     private async void Initialize()
     {
         _stage = Stage.Initializing;
         _time = 0;
         // xasset初始化,如解包等
         if (!Versions.Initialized)
         {
             Versions.VerifyMode = VerifyMode.Size;

             var initialize = Versions.InitializeAsync();
             await initialize.Task;
             if (initialize.status != OperationStatus.Success)
             {
                 // TODO: 提示失败
                 InitializeFailed();
                 return;
             }

             LanguageMgr.Instance.UpdateLanguageDict();

             Downloader.DownloadURL = "https://downloadpath.com/Bundles/";
         }

         ProgressTo(0.01f, 0.5f);

         _stage = Stage.CheckingUpdate;
         _time = 0;
         var checkUpdateAsync = Versions.CheckUpdateAsync();
         await checkUpdateAsync.Task;
         if (checkUpdateAsync.status != OperationStatus.Success)
         {
             // TODO: 提示失败
             CheckUpdateFailed();
             return;
         }

         _stage = Stage.Updating;
         _time = 0;
         if (checkUpdateAsync.downloadSize > 0)
         {
             var downloadAsync = checkUpdateAsync.DownloadAsync();
             // TODO: 更新
             downloadAsync.updated += files => { };
             await downloadAsync.Task;
             if (downloadAsync.status != OperationStatus.Success)
             {
                 // TODO: 提示失败
                 UpdateFailed();
                 return;
             }
         }

         ProgressTo(0.1f, 0.5f);

         _stage = Stage.CheckingDownload;
         _time = 0;
         var downloadSizeAsync = Versions.GetDownloadSizeAsync("lua_script", "loading");
         await downloadSizeAsync.Task;
         if (downloadSizeAsync.status != OperationStatus.Success)
         {
             // TODO: 提示失败
             CheckDownloadFailed();
             return;
         }

         _stage = Stage.Downloading;
         _time = 0;
         if (downloadSizeAsync.downloadSize > 0)
         {
             var downloadAsync = downloadSizeAsync.DownloadAsync();
             // TODO: 更新
             downloadAsync.updated += files => { ProgressTo(0.01f, files.downloadedBytes - files.totalSize); };
             await downloadAsync.Task;
             if (downloadAsync.status != OperationStatus.Success)
             {
                 // TODO: 提示失败
                 DownloadFailed();
                 return;
             }
         }
         else
         {
             ProgressTo(0.5f, 1);
         }

         LanguageMgr.Instance.UpdateLanguageDict();

         print("脚本下载成功, 启动游戏");
         LuaManager.Instance.StartGame();
     }

     private void InitializeFailed()
     {
         print("初始化失败");
     }

     private void CheckUpdateFailed()
     {
         print("检查更新失败");
     }

     private void UpdateFailed()
     {
         print("更新失败");
     }

     private void CheckDownloadFailed()
     {
         print("检查下载失败");
     }

     private void DownloadFailed()
     {
         print("下载失败");
     }

     private void Update()
     {
         _time += Time.deltaTime;
     }
 }

到了这里,关于Unity--AB包管理插件-xasset的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Unity 音频插件 - MasterAudio 实现音频管理系统

    插件介绍: Master Audio的是一个整体解决方案,所有的丰富的游戏音频需求。内置的音乐闪避,手动和自动的声音触发真正的随机声音变化,音频汇集全3D声音功能。支持所有出口的手机游戏平台,具有一流的性能。 主音频在线帮助网站可在此处找到: Table of Contents 完整的 主

    2023年04月10日
    浏览(44)
  • 【Unity】AB包下载

    a.AB包分类 一般地,将预制体作为AB包资源,不仅需要对预制体本身进行归类,还要对其涉及的动画(AnimationClip)、动画状态机(AnimatorController)、以及所用到的骨骼(Avatar)、模型(Mesh)、模型所用的材质(Matreial)、材质所用的图片(Images)、Shader等进行归类。 还有一种

    2024年01月23日
    浏览(34)
  • Unity-AssetBundles(AB包)

    AssetBundles AssetBundle工作流 将Asset分配给AssetBundles 构建AssetBundles 加载AssetBundles和Asset 为AssetBundles准备 类型分组 并发内容分组 资产建筑AssetBundles BuildAssetBundleOptions BuildTarget The AssetBundle File  The Manifest File  AssetBundle依赖性 AssetBundles信息 加载AssetBundles  使用原生AssetBundles AssetB

    2024年02月02日
    浏览(36)
  • Unity组件开发--AB包打包工具

    1.项目工程路径下创建文件夹:ABundles 2.AB包打包脚本: 3.需要打包的场景添加到打包配置: 4.unity编辑器生成菜单: 5.场景加载AB包管理器:

    2024年04月28日
    浏览(36)
  • Unity知识点 -- AssetBundle(AB包)

    特定于平台的资产压缩包,类似于压缩文件 资产包括:模型、贴图、预制体、音效、材质球等 2.1 相对于 Resources 下的资源,AB 包更好管理资源 Resource:打包时定死,只读,无法修改 AB包:存储位置可以自定义,压缩方式可以自定义,后期可以动态更新,通过 AB 包可以做热更

    2024年02月13日
    浏览(43)
  • Unity-WebGL加载AB包

    上文写到PC、IOS、Android项目加载ab包资源,地址: 打包的步骤和上文中的操作相同,唯一的不同就是在Build页面里Build Target选择WebGL。   当项目使用内置渲染管线时,所有材质的Shader为Standard。 1、当项目为URP时,首先需要在Package Manager里导入Universal RP,如图 2、Create—Renderi

    2024年03月11日
    浏览(40)
  • Unity学习笔记之AB包(AssetBundle)

    存储在Resources下的资源,最终会存储在游戏的主体包中,发送给用户,手机系统上,如果需要做资源的更新,是无法使用Resources即时更新(不需要关闭手机游戏,即可实现游戏更新). AB包是 独立于游戏主包存在的资源存储文件 ,使用内部资源时,需要单独下载和加载。 AB包

    2024年03月10日
    浏览(42)
  • 【Unity】AssetBundle资源异步加载以及AB包卸载

    以下代码是基于上一篇文章《AssetBundle资源同步加载》的代码新增了异步加载和AB包卸载功能,有兴趣的同学可以去看看我的上一篇文章。 由于异步加载需要配合协程进行功能开发,所以我对之前封装的AB包资源加载管理器进行修改,改为继承MonoBehaviour的单例模式。 主要修改

    2023年04月08日
    浏览(34)
  • 基于Unity开发WebGL项目加载AB包(三)

    在前两篇文章中,我们分别了解了WebGL如何通过StreamingAssets加载AB包资源(链接:基于Unity开发WebGL项目加载AB包(一)_梵高先森丶的博客-CSDN博客)和如何通过局域网(本地服务器)加载AB包资源(链接:基于Unity开发WebGL项目加载AB包(二)_梵高先森丶的博客-CSDN博客),那么本文,

    2024年02月13日
    浏览(38)
  • Esbuild基本使用与插件开发

    作为Vite的双引擎之一,Esbuild在很多关键的构建阶段(如依赖预编译、TS语法转译、代码压缩)让Vite获得了相当优异的性能,是Vite高性能的得力助手。无论是在Vite的配置项还是源码实现,都包含了不少Esbuild的基本概念和高阶用法。因此,要深入掌握Vite,学习Esbuild必不可少。

    2024年02月05日
    浏览(25)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包