精华内容
下载资源
问答
  • xasset
    千次阅读
    更多相关内容
  • Hyde是Call of Duty XAsset编译器,可将原始资产转换为可消化的数据。 它的主要目的是生成为动力的数据。 Hyde旨在与使命召唤XAsset”出口商一起使用。 未提供原始XAsset,您必须自己获取它们。 要求 用法 如运行不...
  • xasset 插件使用

    2022-05-31 17:13:16
    xasset 是快速、强大的 Unity 资产交付系统。 使用 xasset 可以让 Unity (游戏或应用)程序更快,更好的打包,发布和运行。

    Xasset插件使用

    xasset 是快速、强大的 Unity 资产交付系统。
    使用 xasset 可以让 Unity (游戏或应用)程序更快,更好的打包,发布和运行。

    1.插件导入

    1.1 插件下载

    Github链接
    下载Zip包,解压之后就是如下几个文件
    将unitypackage直接拖入Unity工程即可
    image-20220531150346913

    1.2 初始化bulid assets

    我们刚导入插件进来,我们需要使用插件自己的打包方法,将我们的资源进行打包,它才能去使用
    image-20220531150408535

    1.3 运行demo 体验流程

    image-20220531150432658
    四个Demo依次体验
    image-20220531150443059

    2.插件的使用

    2.1 插件的初始化

    初始化流程
    场景中挂载了Startup组件,在其Start方法内调用了Versions.InitializeAsync()对versions.json取样,分析Versons.json来进行版本控制
    image-20220531150519417
    注意:这个地址尤为重要,表示我们资源加载的路径

    image-20220531150659249

    2.2 自定义Bundle进行打包

    我们定义了如下n个bundle
    image-20220531150711819
    然后Build
    image-20220531150722503

    2.3 打包文件分析

    打包出来的 versions.json 文件,存放了该版本的打包信息
    可用于版本管理

    image-20220531150737999

    3.将ab资源上传到服务器进行下载

    3.1服务器下载

    HFS服务器讲解
    HFS服务器下载链接
    双击exe运行
    image-20220531150811417

    3.2 资源上传至服务器

    将Bundles文件夹拖入该目录
    image-20220531150824136
    选择Real folder文件夹
    image-20220531150833664
    复制url进入浏览器正确即如下显示
    image-20220531150845480

    3.3 修改初始化组件的资源地址

    我们将DownLoadURL设置为我们自己服务器的url

    image-20220531150855304

    3.4 修改插件的运行模式

    修改为Increment 增量模式

    编辑器可以还原真机加载热更环境,线上问题可以在本地快速还原现场和处理。

    image-20220531151648711

    image-20220531151707200

    3.5 运行测试 结果分析

    我们发现,出现了版本更新,需要我们下载资源

    其实我们下载的资源都是放到服务器的,我们需要这个资源的时候再去服务器检测更新然后放到本机的持久化路径下面

    然后每一次将Version.json和服务器下载下来的Version进行对比

    然后将被更新的ab包重新下载 或者 下载本机没有的ab包

    image-20220531151955636

    我们这里发现,首先是向服务器下载我们的Versions.json文件,然后比较,然后根据Versions.json来下载我们的bundle

    image-20220531152102753

    然后我们可以在本地路径发现到我们下载的文件

    image-20220531152905440

    3.6 自动检测更新脚本

    在3.5中,我们只需要点击一次检测更新按钮,我们就会将更新的文件进行下载

    那么,具体是怎么实现的呢

            private IEnumerator Checking()
            {
                PreloadManager.Instance.SetVisible(true);
                PreloadManager.Instance.SetMessage("获取版本信息...", 0);
                var checking = Versions.CheckForUpdatesAsync();
                yield return checking;
                if (checking.status == OperationStatus.Failed)
                {
                    MessageBox.Show("提示", "更新版本信息失败,请检测网络链接后重试。", ok =>
                    {
                        if (ok)
                        {
                            StartCheck();
                        }
                        else
                        {
                            OnComplete();
                        }
                    }, "重试", "跳过");
                    yield break;
                }
    
                PreloadManager.Instance.SetMessage("获取版本信息...", 1);
                if (checking.downloadSize > 0)
                {
                    var messageBox = MessageBox.Show("提示", $"发现版本更新({Utility.FormatBytes(checking.downloadSize)}),是否下载?",
                        null, "下载", "跳过");
                    yield return messageBox;
                    if (messageBox.ok)
                    {
                        PreloadManager.Instance.DownloadAsync(checking.DownloadAsync(), GetDownloadSizeAsync);
                        yield break;
                    }
                }
    
                GetDownloadSizeAsync();
            }
    
    

    结束之后,我们所有的资源全部已经被更新了

    4.自定义资源的加载

    4.1 自定义场景加载

    我们创建一个自己的场景,设置AssetBundle

    image-20220531155734294

    进入到Demo加载场景的Scene里面,切换自动加载的场景为我们刚才创建的场景

    image-20220531155937447

    然后Build Bundles

    这里我们修改了Additive场景,这个场景也是一个ab包,所以我们也需要重新打包这个场景,然后重新上传服务器

    image-20220531150408535

    实际的代码实现为,我们只是在外面动态配置场景名

        public class LoadSceneAdditive : MonoBehaviour
        {
            public string sceneName;
            private readonly List<Scene> _scenes = new List<Scene>();
    
            public void Unload()
            {
                //卸载场景
                if (_scenes.Count > 0)
                {
                    var index = _scenes.Count - 1;
                    var scene = _scenes[index];
                    scene.Release();
                    _scenes.RemoveAt(index);
                }
            }
    
            public void Load()
            {
                //加载场景
                _scenes.Add(Scene.Load(sceneName, true));
            }
        }
    

    运行,我们点击加载按钮,发现我们加载成功

    image-20220531160532992

    image-20220531160405128

    实际上我们做了一个下载的操作,将我们的新的ab包进行了下载

    在我们检测更新的时候,就已经完成了新的ab包的下载更新

    image-20220531160510624

    到此为止,我们已经学会了如何使用Xasset来动态加载我们场景的ab包

    4.2 自定义图片加载

    我们创建一个自己的图片,设置AssetBundle,记住现在图片的大小是103.4KB

    image-20220531161641235

    然后打包出来的ab包大小为

    image-20220531163156634

    然后进入Demo里面异步加载图片的地方,替换为我们刚才设置的图片名

    image-20220531162307586

    具体实现代码如下

        public class Async2Sync : MonoBehaviour
        {
            public Image image;
            public string ImagePath;
            private readonly List<Asset> _assets = new List<Asset>();
    
            private void OnDestroy()
            {
                ReleaseAssets();
            }
    
            // Use this for initialization
            public void Load()
            {
                var assetType = typeof(Sprite);
                Profiler.BeginSample("LoadAsset:Async2Sync");
                _assets.Add(Asset.LoadAsync(ImagePath, assetType));
                var asset = Asset.Load(ImagePath, assetType);
                image.sprite = asset.Get<Sprite>();
                Profiler.EndSample();
                image.SetNativeSize();
                _assets.Add(asset);
            }
    
            public void ReleaseAssets()
            {
                foreach (var item in _assets)
                {
                    item.Release();
                }
    
                _assets.Clear();
            }
        }
    

    然后我们将资源进行打包,然后重新上传服务器

    image-20220531150408535

    image-20220531163019228

    我们不难发现,在这里的picture的ab包大小和我们之前的大小一致,表示我们下载了一个本地没有的资源到本地路径下

    image-20220531163048414

    4.3 自定义Prefab(GameObject)的加载

    首先进入Demo里面的Menu场景添加一个新的场景

    image-20220531165844834

    然后我们创建一个新的场景来测试下载GameObject

    image-20220531165016522

    image-20220531170910182

    在这里我们指定下载的GameObject的名字

    image-20220531165333233

        public class Async2SyncGo : MonoBehaviour
        {
            public string GoPath;
            private readonly List<Asset> _assets = new List<Asset>();
    
            private void OnDestroy()
            {
                ReleaseAssets();
            }
    
            // Use this for initialization
            public void Load()
            {
                var assetType = typeof(GameObject);
                Profiler.BeginSample("LoadAsset:Async2Sync");
                _assets.Add(Asset.LoadAsync(GoPath, assetType));
                var asset = Asset.Load(GoPath, assetType);
    
                //获取物体 实例化物体
                GameObject go = asset.Get<GameObject>();
                GameObject.Instantiate(go,Vector3.zero,Quaternion.identity);
    
                Profiler.EndSample();
                _assets.Add(asset);
            }
    
            public void ReleaseAssets()
            {
                foreach (var item in _assets)
                {
                    item.Release();
                }
    
                _assets.Clear();
            }
        }
    

    重新打包,然后重新上传服务器

    image-20220531150408535

    然后我们运行,进入我们新的场景里面,然后我们点击加载

    image-20220531170255377

    image-20220531170300847

    然后我们发现,GameObject加载成功!!!

    image-20220531170226686

    5.常见错误

    5.1 ab包异常导致资源更新出错

    如果我们在本地删除了某个资源,但是它的ab包资源还是在服务器,或者说,ab标签还在Version.json文件里面

    这个时候我们去检测更新,实际上我们是需要下载这个不需要的ab包到本地的

    但是问题就出现在,我们路径匹配的时候,我们无法在本地找到这个对应的资源

    因为我们的插件会自动将我们的名字和路径存储到一个字典,所以这一步就会出错

    解决方法:

    全部删除之前的ab包,也就是Bundles文件夹,然后重新build,重新上传服务器

    展开全文
  • XAsset 为 Unity 项目提供了一套"简便"的资源管理环境,借助 XAsset,你可以很方便的对Unity项目中的 AssetBundle 资源进行构建,加载,释放。
  • 上个月花时间把XAsset这套资源框架的代码看了一遍且写了一遍。XAsset官网:https://xasset.github.io/#/compare-plans。我看的是它的7.0体验版本,所以功能上并不完整,不过尽管如此还是学到了很多的东西。 XAsset...

            上个月花时间把XAsset这套资源框架的代码看了一遍且写了一遍。XAsset官网:https://xasset.github.io/#/compare-plans。我看的是它的7.0体验版本,所以功能上并不完整,不过尽管如此还是学到了很多的东西。

          XAsset框架的代码量很少,架构很清晰,我认为作为一个学习的目的来看这个框架是非常不错的选择(老实说在这之前我去看Addressable的代码,是没能看下去),它也让我对这一部分知识的理解有了提升,并且在此基础上我回头再次看了一遍项目中使用的框架,又有了新的理解。

            在看的同时,我画了它的UML图,本想放出来,但是已经找不到扔哪去了。。。另外,我把它与项目中正使用的框架从加载和卸载两个方面进行了仔细的对比,写了份文章,然而项目代码是不能随便放的,所以也只能存在我的有道云笔记里。至于热更部分,由于XAsset我看的只是一个体验版本,不仅是个Demo并且没有经历过实际项目的打磨,没什么好比较的。

             在对比过程中,我对我认为不够好的一些地方做了修改:

            加载部分

            主要是GC问题,在加载流程中所使用到的new对象的操作,我一律做了池化处理,主要是解决框架本身带来的GC问题,这个问题在项目中肯定是很严重的。

            另外,我增加了直接加载AssetBundle的操作,因为有一些资源是需要直接加载AB统一做处理的,比如shader、配置表。

            卸载部分

            原XAsset做了一个简单的引用计数。当你加载asset的时候,asset会计一个引用,同时它所在的AB以及依赖AB也均计一个引用。当你调用接口release此asset时,asset、AB、依赖AB的引用也都相应减1。而当这些东西引用为0时,会从缓存列表中移除并且AB会调用unload(true)来移除掉。这样的机制是没有问题的,问题出在假如业务层没有正确的去调用release接口,那么缓存的asset以及对应AB、依赖AB都没有办法卸载掉,会一直存在于内存中。这个机制无疑是有问题的,因为业务层的操作是无法保证的。

            所以针对这个问题,我把它的引用计数改成了两种形式,一种是单纯的使用一个数字去计引用,而另一种则使用weakReference的机制来避免这个问题,首先贴一下代码:

    using System;
    using System.Collections.Generic;
    using UnityEngine;
    
    namespace Framework.Res.Runtime
    {
        public class WeakRef : IReference
        {
            private List<WeakReference> _references;
    
            public WeakRef()
            {
                _references = new List<WeakReference>();
            }
    
            public bool Unused
            {
                get { return GetReferenceCount() <= 0; }
            }
    
            public void Retain(object owner)
            {
                if (owner == null)
                {
                    Logger.LogError("owner is null");
                    return;
                }
    
                int count = _references.Count;
                for (int i = 0; i < count; i++)
                {
                    if (owner.Equals(_references[i].Target))
                    {
                        return;
                    }
                }
    
                WeakReference weakReference = new WeakReference(owner);
                _references.Add(weakReference);
            }
    
            public void Release(object owner)
            {
                if (owner == null)
                {
                    Logger.LogError("owner is null");
                    return;
                }
    
                int count = _references.Count;
                for (int i = 0; i < count; i++)
                {
                    if (owner.Equals(_references[i].Target))
                    {
                        _references.RemoveAt(i);
                        break;
                    }
                }
            }
    
            public int GetReferenceCount()
            {
                int count = 0;
                for (int j = 0; j < _references.Count; j++)
                {
                    if (_references[j].Target != null)
                    {
                        if (_references[j].Target.GetType() == typeof(GameObject))
                        {
                            GameObject go = (GameObject)_references[j].Target;
                            if (go != null)
                            {
                                count++;
                            }
                            else
                            {
                                //Target不为null,go为null,特殊处理
                                _references.RemoveAt(j);
                                j--;
                            }
                        }
                        else
                        {
                            count++;
                        }
                    }
                }
                return count;
            }
    
            public void Reset() 
            {
                _references.Clear();
            }
        }
    }

             具体怎么使用呢?一般我们加载完资源以后,会提供一个接口供业务层获取这个资源,这时候我要求业务层传入一个持有者。比如说一个UI组件用到一张图片,那么你想得到这个图片的资源,就把这个组件对象传进来:

            public Object GetAsset(object owner)
            {
                if (owner == null) return null;
    
                reference.Retain(owner);
                return asset;
            }

            而此同时,在内部用weakReference将这个引用记下来,并且在GetReferenceCount时通过WeakReference.Target便可知道这个UI组件还是否存在,若不存在,则也代表你不再需要这个资源了,便可不必再计这个引用。

            这样一来,业务层便不再需要主动调用Release()接口去释放自己的引用,只需要销毁你这个持有者便可,最坏的情况,也会在切换场景时自动被销毁掉。不过使用这种方法,需要再update中定时去检测每个资源的引用情况,不过相比较于它原生的那种必须正确使用的方式,这样保证了那些不再被使用的资源可以正确的被释放掉。

            另外,上面说到了直接加载AB的情况,针对这种情况,一般在拿到AB后会自己通过AB去加载AB内的资源然后缓存起来,所以我在接口回调之后添加了自动卸载AB的操作,让上层不必考虑卸载的问题。同时,这时候在AB没有引用时也不能再使用unload(true),因为这样会一并卸载掉上层缓存的东西,所以需要改成unload(false)。

    展开全文
  • 前言:XAsset资源热更框架是一个非常优秀的AssetBundle热更框架,可以实现资源及场景热更。非常感谢框架作者及其团队,XAsset4.0是开源免费的,XAsset已更新迭代到了更加强大好用的6.1版本,有兴趣的同学可以去X...

    前言:XAsset资源热更框架是一个非常优秀的AssetBundle热更框架,可以实现资源及场景热更。非常感谢框架作者及其团队,XAsset4.0是开源免费的,XAsset已更新迭代到了更加强大好用的6.1版本,有兴趣的同学可以去XAsset官网进行了解:https://game4d.cn/。此篇内容只是对XAsset4.0如何使用进行介绍。
    1、在GitHub中下载XAsset4.0源码https://github.com/xasset/xasset,其中源码中包含了Demo便于大家学习。
    在这里插入图片描述
    2、使用unity打开项目,并将XAsset目录归类到3rd文件夹中 ,个人习惯,不归类也是可以的。
    在这里插入图片描述
    3、目录结构分析
    XAsset文件夹:框架的源码及示例,
    Splash.unity:场景启动画面
    Init.unity:初始化场景
    Manifest.asset:记录热更资源的信息
    在这里插入图片描述
    在这里插入图片描述
    其中
    Dirs:记录全部热更资源路径,不包含文件名
    Assets:记录资源热更资源的文件名
    Bundles:记录热更资源所属的AssetBundle名称,和Dirs中对应。AssetBundle名称使 用Crc算法生成。

    Rules.asset:记录热更资源打包规则。
    其中
    Patterns部分:资源分类,不要去改动,框架作者已经为我们分类好了。
    Builds部分用户设置的热更资源。
    Version:版本号,每次打热更包时,自动加1。
    Scenes In Build :设置启动场景和初始化场景,这两个场景不参与热更。
    Rules:用户设置的打包规则,会记录在这里
    在这里插入图片描述
    设置AB包打包规则,操作如下图。
    在这里插入图片描述
    4、简单进行资源热更使用
    1)新建GameData目录,并在此目录下再建Images和Scenes文件夹。新建场景,保存在Scenes目录下。找一张背景图,放在Images目录下。
    在这里插入图片描述
    2)在场景中添加图片和文字,并保存场景
    在这里插入图片描述
    3)设置热更规则,在Images文件夹右键选择Directory规则,在Scenes文件夹上右键选择Scene规则(注意:设置规则前先将Rules.asset中的Rules的Size设为0)
    在这里插入图片描述
    4)现在可以对热更资源进行打AB包,打包出来的会存放在与Assets同级目录的DLC目录中。DLC目录下会根据用户所选择的应用平台创建相应的文件夹。
    在这里插入图片描述
    在这里插入图片描述
    5)将DLC文件夹放到资源服务器上。
    在这里插入图片描述
    6)打开Init场景,将资源服务器链接填入Updater中,并将GameScene设置为我们刚刚创建的场景即:Main.unity
    在这里插入图片描述
    7)修改Updater类中场景的路径
    在这里插入图片描述
    8)如果不需要VFS弹窗提示,可以在Updater类中按如下修改,这里取消了此处弹窗。
    在这里插入图片描述
    9)此时我们可以打包运行程序,打包出来的应用会存放在与Asset文件夹同目级下的Build文件夹中
    在这里插入图片描述
    10)如果不出意外的话,运行程序,界面会提示我们下载资源。下载后的资源会存在持久数据路径的DLC文件夹下。
    在这里插入图片描述
    在这里插入图片描述
    11)资源下载完毕,进入Main场景
    在这里插入图片描述
    12)修改场景内容,我们修改图片和文字
    在这里插入图片描述
    13)重新打AB包,更新资源服务器。
    14)系统检测到有热更资源,将对应用进行资源热更新
    在这里插入图片描述
    15)此时Main场景中的文字和图片都已自动更新,资源热更完成。
    在这里插入图片描述
    此篇内容只是简单的介绍如何使用XAsset4.0进行资源热更,更多功能请参考框架示例代码。目前XAsset已更新迭代到了XAsset6.1版本,功能更加强大。

    展开全文
  • 热更框架xasset bug

    2021-03-26 11:07:56
    本着学习的心态去看前辈Unity资源更新的开源框架,最近在看在github上有1.3k star的项目xasset,确实精简,对于踩过的坑比如循环依赖,资源冗余,引用计数内存管理都处理了,而且有特色的一点是支持Virtual File ...
  • AssetBundle 神器之 XAsset 管理AB包

    千次阅读 2020-09-09 11:14:43
    XASSET杀人越货居家旅行必备框架。” XASSET 4.0 主要为有资源版本更新需求的Unity项目提供了一个更精简、高效、安全的资源管理方案. XASSET 5.1为Unity项目提供了可以快速投入到生产环境中使用的具有更智能和...
  • xasset 致力于让 Unity 程序快速交付。 官网:https://xasset.pro 文档:https://xasset.pro/docs/getstarted 示例:https://xasset.pro/example 注:示例使用 WebGL 运行,部分功能可能无法使用。 xasset ...
  • 前言技能系统暂时告一段落,现在要花点时间规范一下客户端这边的资源管理以及一些流程优化,这里选择轻量高效资源管理框架xassetxasset开源地址​github.com版本为:...一天就能看个差不多,但是质量...
  • xasset 是开箱即用的 Unity 资源分包、加密、热更框架。 使用 xasset 可以轻松快速地开发跨平台的 Unity 游戏或应用程序,并灵活把控程序的安装大小和缩短程序的交付时间。 官网:https://xasset.pro 文档:...
  • xasset, 谷歌aab分包
  • 【Unity】关于XAsset的一个坑

    千次阅读 2018-01-20 15:14:00
    最近新出了一个资源管理框架XAsset(点我带你了解XAsset),闲来无事拿来研究研究,发现了一个坑,就是如果每次rule重新设置了,然后重新打包,等到加载AB包的时候会报如下错误:  KeyNotFoundException: The ...
  • xasset目录中的Settings文件,Script Play Mode选项卡设置为Inrement,模拟真实AB包读取。(这会导致每次开始运行时提示将数据迁移到streaming asset)创建SplitConfig文件,在xasset目录中选中Settings文件,将...
  • 3月16日,基于Monero的隐私稳定币协议Haven Protocol官方宣布,已为公共测试网xAsset推出一个新浏览器,可查询测试网中每个资产循环供应数据。 文章链接:https://www.tuoluocaijing.cn/kuaixun/detail-160653.html ...
  •  最近马三有幸参与开发了一个简易轻量的Unity资源管理框架 xAssetxasset 提供了一种使用资源路径的简单的方式来加载资源,简化了Unity项目资源打包,更新,加载,和回收的作业流程,非常适合没有接触过资源管理的...
  • AssetStudio.x64.v0.14.38.rar

    2021-07-18 16:51:54
    AssetStudio拆包工具,可以用来拿出unity游戏中的资源
  • Perfare版本的2019/06/16发布的Asset Studio 其地址如下: https://github.com/Perfare/AssetStudio/releases
  • AssetStudio.x64.v0.14.16.zip

    2020-03-27 09:30:36
    AssetStudioGUI是一款能够提取游戏立绘和动画资源的软件,支持Unity版本到2018.2,而且还支持动画的导出,是动画制作人员的必备软件,Unity Studio中文版分为X64和X32版本,用户可以查看自己的图片、shader、文本...
  • AssetStudio.x64.v0.13.21.rar

    2020-06-15 18:37:41
    unity资源提取工具AssetStudio, 可提取Unity 版本Unity2018及以下各个版本
  • AssetStudio.x64.v0.14.12.zip

    2020-03-31 08:40:33
    AssetStudio.x64.v0.14.12.zip,AssetStudio.pdb,OpenTK.dll,AssetStudioUtility.pdb,AssetStudio.dll,AssetStudioGUI.exe,fmod.dll,OpenTK.pdb,Texture2DDecoder.dll,OpenTK.GLControl.pdb,Texture2DDecoder.pdb,...
  • AssetStudio.x64.v0.13.5.zip

    2019-07-23 11:25:45
    UnityStudio 拥有可视化界面,可以批量导出贴图,模型,字体,音频等,可以预览,最新版支持Unity5.x,所以在这使用UnityStudio作为资源提取工具。
  • AssetStudio.x64.v0.12.62.zip

    2019-11-08 13:53:25
    AssetStudio.x64.v0.12.62 查看unity assetbundle 内容

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,195
精华内容 9,678
关键字:

xasset