tangzx / absystem Goto Github PK
View Code? Open in Web Editor NEWUnity3D AssetBundle 打包与管理系统
Unity3D AssetBundle 打包与管理系统
AssetBundleDataReader中有个字段shortName2FullName。我疑惑的是这个dictionary的key-shortname,可能不具有唯一性。这种时候, 方法public string GetPathByShortName(string shortName)真的能够成立么?还是说应该在取名字的时候就人为地确定唯一性?
请问这个支持u5 还是 u4的?
<linker> <assembly fullname="mscorlib"> <namespace fullname="System.Security.Cryptography" preserve="all"/> </assembly> </linker>
我今天发现 如果选择.NET 2.0 Subset 将导致IL2CPPBuild失败, 如果是选Mono或者选.Net 2.0 编译则没有问题, 查找了下原因, 原来是link.xml的问题, 然后我尝试去掉一些, 最后发现只留这一个就可以了, 而且也能顺利通过Build. 抱歉之前有些不严谨了.
今天爬文爬到這工具, 不小心手殘就按出問題~
觸發方式: 在 AssetBundleBuildPanel UI 的清單項目上按下 'Select', 接著選擇 '取消' 關閉視窗, 接著 UI 就會不斷刷出這個 Exception
NullReferenceException: Object reference not set to an instance of an object
...(略)
Tangzx.ABSystem.AssetBundleBuildPanel.OnListElementGUI (Rect rect, Int32 index, Boolean isactive, Boolean isfocused) (at Assets/ABSystem/Editor/AssetBundleBuildPanel.cs:79)
...(略)
原因應該是
filter.path = GUI.TextField(r, filter.path);
第一個參數不能為 null 造成的.
我修正的方式是把84行附近的:
if (GUI.Button(r, "Select")) { filter.path = SelectFolder(); }
增加檢查來避免給 null.
if (GUI.Button(r, "Select")) { var path = SelectFolder(); if (path != null) filter.path = path; }
比如一个角色,可能会用到n个材质,n张图,n个mesh,这样如果一个个加载太碎了,这样不是好事吧
我写了个同步加载方法, 然后在IOS下ab加载不出来, 看了下路径才发现, 本来有forWWW做判断, 但是最后一个宏else没有这个判断直接返回file://开头的路径了, 坑啊~~ 劳烦您改下吧~
目前在代码中看不出有什么作用,可以直接去掉吗?还是有什么特殊用途?
Hi,唐哥,在我们调用AssetBundle.mainAsset取出mainAsset时,它的get方法会阻塞地去Load mainAsset
所以其实我们应该异步去LoadAssetAsync,以达到完全异步的目的吧?
场景打为AB和不打为AB,直接LoadScene也会自动加载依赖的AB资源,如果手动加载一遍,LoadScene还是会加载依赖,那不是 无法管理了嘛?
如果场景打为AB,那需要如何加载呢?
谢谢!
您好 ,在资源没有变化的情况下,打包assetsBundle文件有时会有变化。 我更新ab文件使用的是ab文件的md5码, 没有变化的情况下这个文件打包会变的话每次都要更新。
比如ab.manifest前后打包 :
第一次 :
Dependencies:
第二次:
Dependencies:
第一条和第二条的顺序变了
需要上传cache.txt文件吗?感觉只能本地操作啊
唐哥,看完你的ABSystem,但并未发现有增量打包的使用。
在AssetTarget类中有_isFileChanged标识该文件是否被修改, 但是该标志位并未被真正的使用到。
我们游戏项目中,初次打过一次ab后,以后每次新增资源打ab的速度都很快,仿佛unity内部做了增量打ab。
所以想问下 增量打ab是否有必要?
我发现如果再Build Setting里设置代码剥离级别为 Strip Assemblies时候, 所提供的的HashUtils里面的
HashAlgorithm.Create()方法返回的实例为null, 并且我单独只用这个脚本建立demo尝试过, 最后谷歌了一下, 发现需要添加link.xml文件, 并且需要里面添加指定不被剥离命名空间才可以, 请问作者没有遇到这个问题吗?
建议在git库里把link.xml添加进去.
具体link.xml内容如下: 试了这个才好使
<linker> <assembly fullname="System.Core"> <namespace fullname="System.Security.Cryptography" preserve="all"/> </assembly> <assembly fullname="mscorlib"> <namespace fullname="System.Security.Cryptography" preserve="all"/> </assembly> <assembly fullname="System"> <namespace fullname="System.Security.Cryptography" preserve="all"/> </assembly> <assembly fullname="System.Security"> <namespace fullname="System.Security.Cryptography" preserve="all"/> </assembly> <assembly fullname="Mono.Security"> <namespace fullname="System.Security.Cryptography" preserve="all"/> </assembly> </linker>
ios真机测试第一次运行报错,在此点开就可以了。
这应该是一个prefab出现了问题
Could not open file archive:/CAB-1b8f595829568a4847896f5f91ffa899/CAB-1b8f595829568a4847896f5f91ffa899.resS for read
(Filename: Line: 56)
async texture load: failed to load SpriteAtlasTexture-prompt-128x128-fmt4 from archive:/CAB-1b8f595829568a4847896f5f91ffa899/CAB-1b8f595829568a4847896f5f91ffa899.resS
AssetBundleManager 第174行,少了个分号。
改成Mono就不会报错了,报错如下:
8:02:53.861 2495 2510 E Unity : The file can not be loaded because it was created for another build target that is not compatible with this platform.
09-05 18:02:53.861 2495 2510 E Unity : Please make sure to build AssetBundles using the build target platform that it is used by.
09-05 18:02:53.861 2495 2510 E Unity : File's Build target is: 19
你好,在Unity 4.x 下面,Builtin资源并没有标记为AssetType.Builtin
但是在BuildExportTree,needSelfExport,GetHash的时候,是把Builtin特殊处理过了。但实际上永远不会执行?请问是bug还是有意为之?
另外,Builtin资源到底应该独立打包,还是随使用者一起打包?根据MobileAssetBundleLoader下有一个专门的LoadFromBuiltin,是否说明Builtin资源也应该独立打包单独加载?
谢谢
如果Sprite 包含Sprite Tag, 每个ab都打入了一张图集~
如果一个实体在加载资源过程中销毁了,如何取消加载?
在Unity Editor5.6.4下,切换到Android平台,材质Shader为Unlit/Texture时,通过AB加载模型显示紫色.
材质Shader为Legacy Shaders/Diffuse时,通过AB加载模型显示正常呢。
Demo场景可复现。
有什么方法可以实现同步加载AB吗?
举个例子:Shader,假设添加了shader的defaultTextures。5.x中也只是改变shader的meta文件而已。这样子是不是有点问题呢。
你好,我有个疑问:
首先,AssetBundleInfo.Instantiate()方式创建的go Instance能够由ABSystem去维护引用计数。
问题1:
1.对于不实例化直接使用的资源,则会直接访问mainObject,ABSystem对此无感知,有什么办法将此类型资源也管理起来么
2.目前AssetBundleInfo.UnloadBundle调用的是bundle.Unload(false),只能卸载掉Bundle内存,对于资源类型(Texture等)并不能卸载掉,只能通过Resources.UnloadUnuseAsset来卸载(仍然会造成卡顿)。
如此一来,是否ABSystem直接调用Unload(true)更加有效呢?但需要考虑下直接引用mainObject如何管理引用
我想问下,我可以迁移你的absystem一部分引用相关的代码到我的框架里么?
因为米有看到授权文件,所以来问下~
你好,为了使用 CreateFromFile,此系统采用的是非压缩打包。先不讨论自己压缩,网络下载完成再解压缩的问题,因为都可以写代码解决。(如果直接使用LoadFromCacheOrDownload可以避免上述问题)
但有一个问题,目前来看好像无法解决:初始包的大小。因为我们初始包会打完整包,放到StreamingAssets下。这个文件夹在真机上是只读的。
所以我们的项目还是采用LoadFromCacheOrDownload,压缩打包。
请问作者是怎么考虑这个问题的?
谢谢
我修改了下
public virtual void Dispose()
{
UnloadBundle(true);
......
}
void UnloadBundle(bool unload = false)
{
if (bundle != null)
{
if (AssetBundleManager.enableLog)
Debug.Log("Unload : " + data.compositeType + " >> " + data.debugName);
bundle.Unload(unload);
}
bundle = null;
}
这样释放的时候 相当于调用了 AssetBundle.Unload(true). 我测试了一下Profiler里面可以正常把贴图给释放掉了.
不知道我理解的对不对
你好,请教个实际问题:如何加快做版本的速度?
以我们的游戏为例,如果不用AB模式,做版本大概10分钟左右。(即用Resources.Load)
如果要用AB包,第一次做版本需要大概2个小时。后续就算增量打包AB包也要30分钟左右。这个时间对于正常的项目迭代实在是无法忍受。
打包AB时间主要消耗在2个方面:
一是分析需要打包的资源,LoadAsset资源慢,CollectDependencies更慢
二是打包本身慢BuildAssetBundle,特别是地图修改的话。如果开了压缩打包,时间还要增加
请问有没有什么优化建议?谢谢
看到AssetTarget和其它代码中,进行打包的时候是考虑一个资源一个bundle的,请教一下是有什么特殊的考虑呢,为何不将一组资源打到一个bundle里?
拆到逐资源打bundle ,如果资源量大,bundle的额外内存开销是否也不小呢?
目前加载AB的接口都是异步式的, 但同步LoadAB需求也有呀, 作者加载AB从来都是异步的吗, 能在AssetBundleManager里设计个同步加载的接口吗
就是那个条目变多时候, 突然才意识到这个问题, 然后我尝试把条目增加很多, 然后也超过最大化的窗口时, 下面的过滤条目就看不到了, 然后也没滚动条, 然后我就给加了个, `希望您顺手加上~~
代码如下:
Vector2 scollbarPos = Vector2.zero;
GUILayout.BeginVertical();
scollbarPos = GUILayout.BeginScrollView(scollbarPos, "HiddenScrollbar", "verticalscrollbar");
GUILayout.EndScrollView();
GUILayout.EndVertical();
scollbarPos是字段, 然后在那个//context后的开始竖向布局和结束布局加上那两句代码就成.
3个资源PrefabA PrefabB ImgC
其中PrefabA 依赖PrefabB 和ImgC,PrefabB 依赖ImgC
打包配置指定PrefabA和PrefabB为root
调试跟踪代码发现,最终生成的依赖关系是:PrefabA -> PrefabB -> ImgC,PrefabA对ImgC的直接依赖会再分析过程Analyze中被优化移除掉。
但是在BeforeExport过程中因为ImgC只有一Root:PrefabB作为其直接子节点,因此ImgC的导出类型AssetBundleExportType还是Asset。然后在实际打包过程中ImgC是不会被单独打包的,但是由于unity5.X的打包机制,unity会保证资源完整性,在PrefabA的AB包和PrefabB的AB包中都会有一份ImgC的存在,存在了冗余。
感觉这里更好的方案是不是ImgC和PrefabB一起打包更加合适一点
每个Canvas依赖的图片,打出的ab都有图集。该如何弄呢
AsyncUploadManager: Failed to close file archive:/CAB-020b3b51eeb82f5f87f9c0f95e001576/CAB-020b3b51eeb82f5f87f9c0f95e001576.resS. Ensure all async operations are complete before unloading bundles.是什么原因呢
/// <summary>
/// Texture
/// AudioClip
/// Mesh
/// Model
/// Shader
/// 这些类型的Asset的一配置是放在.meta中的,所以要监视它们的变化
/// 而在5x中系统会自己处理的,不用管啦
/// </summary>
void LoadMetaHashIfNecessary()
RunTime Player:
NotImplementedException: The requested feature is not implemented.
at Tangzx.ABSystem.AssetBundlePathResolver.GetBundleSourceFile (System.String path, Boolean forWWW) [0x00000] in :0
at Tangzx.ABSystem.AssetBundleManager+c__Iterator0.MoveNext () [0x00000] in :0
at UnityEngine.SetupCoroutine.InvokeMoveNext (IEnumerator enumerator, IntPtr returnValueAddress) [0x00000] in :0
UnityEngine.MonoBehaviour:StartCoroutine_Auto_Internal(IEnumerator)
UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator)
Tangzx.ABSystem.AssetBundleManager:Init(Action)
Test:Start()
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.