草庐IT

Unity--AB包管理插件-xasset

qq_50682713 2024-01-17 原文

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)

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的更多相关文章

  1. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  2. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  3. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  4. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  5. unity---接入Admob - 2

    目录1.AdmobSDK下载地址2.将下载好的unityPackagesdk导入到unity里​编辑 3.解析依赖到项目中

  6. Unity 3D 制作开关门动画,旋转门制作,推拉门制作,门把手动画制作 - 2

    Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u

  7. ruby-on-rails - 您希望看到哪些 Rails 插件? - 2

    您认为可以作为插件很好地存在于您的Rails应用程序中必须实现的哪些行为?您过去曾搜索过哪些插件功能但找不到?哪些现有的Rails插件可以改进或扩展,如何改进或扩展? 最佳答案 我希望在管理界面中看到一个引擎插件,它提供了应用程序中所有模型的仪表板摘要,以及可配置的事件图表。 关于ruby-on-rails-您希望看到哪些Rails插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questio

  8. ruby - vagrant 从 github 安装插件 - 2

    我们正在使用Vagrant进行部署,我们最终希望将此集群部署在Rackspace上。vagrant-rackspace插件是一个自然的选择,但它有一些错误,这些错误未包含在最新的0.1.1版本中(notablythatvagrantprovisiondoesn'twork)。我已经在我的personalfork中解决了这个问题通过合并其他人的工作来对存储库进行改造。是否可以从github安装vagrant插件?显而易见的事情没有奏效:[unix]$vagrantplugininstallvagrant-rackspace--plugin-sourcehttps://github.com

  9. Unity Shader 学习笔记(5)Shader变体、Shader属性定义技巧、自定义材质面板 - 2

    写在之前Shader变体、Shader属性定义技巧、自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用,方便后续回顾查看,如有以偏概全、不祥不尽之处,还望海涵。1、Shader变体先看一段代码......Properties{ [KeywordEnum(on,off)]USL_USE_COL("IsUseColorMixTex?",int)=0 [Toggle(IS_RED_ON)]_IsRed("IsRed?",int)=0}......//中间省略,后续会有完整代码 #pragmamulti_c

  10. 三分钟集成 TapTap 防沉迷 SDK(Unity 版) - 2

    三分钟集成Tap防沉迷SDK(Unity版)一、SDK介绍基于国家对上线所有游戏必须增加防沉迷功能的政策下,TapTap推出防沉迷SDK,供游戏开发者进行接入;允许未成年用户在周五、六、日以及法定节假日晚上8:00-9:00进行游戏,防沉谜时间段进入游戏会弹窗进行提示!开发环境要求:Unity2019.4或更高版本iOS10或更高版本Android5.0(APIlevel21)或更高版本🔗Unity集成Demo参考链接🔗UnityTapSDK功能体验APK下载链接二、集成前准备1.创建应用进入开发者后台,按照提示开始创建应用;2.开通服务在使用TDS实名认证和防沉迷服务之前,需要在上面创建的应

随机推荐