StreamingAssets文件夹下的资源,会不经处理放到安装包中。所以一般StreamingAssets会放一下二进制文件
StreamingAssets文件夹下的资源,会不经处理放到安装包中。所以一般StreamingAssets会放一下二进制文件
资源加载到内存,需要unload,不然会占用内存,否则会长期占用内存。不能在使用该资源时unload
manifest文件中的CRC校验文件的完整性
下载的文件CRC与manifest文件对比,如果一致,说明下载的文件是完整的
manifest文件中的CRC校验文件的完整性
下载的文件CRC与manifest文件对比,如果一致,说明下载的文件
本地文件前缀需要加上file:///
根据ab包的来源,采用不同的ab
Unity不会自动加载依赖。一般先加载依赖的包,再加载GO。补充:主要在使用前,
开发中,会存在本地,通过测试后,通过http网络传输,上传到服务器
AssetBundles当前目录生成的目录,定义当前目录生成了那些ab包,是二进制文件。每一个manifest
创建出的AB包是有平台限制的
1.
localhost 后面的斜杆必须是 /
有个疑问,之前公司项目一直是unity4.6.5,所有的打包基本上都是代码控制,依赖关系的处理是在打资源之前将所有的依赖关系打成一张xml,这个XML和5.X以后的AssetBundleManifest是一个作用吗?
Unity3d 2019无需下载浏览工具,本身自带
Unity3d 2019中,UnityWebRequest不包含GetAssetBundle()方法,需要使用UnityWebRequestAssetBundle代替。
/// <summary>
/// 本地同步加载
/// </summary>
void Synchronous(string ObjName)
{
string path = "AssetBundles/"+ObjName+".unity3d";
AssetBundle ab = AssetBundle.LoadFromFile(path);
GameObject tmp = ab.LoadAsset<GameObject>(ObjName);
GameObject go = Instantiate(tmp);
go.transform.parent = this.transform;
go.transform.localPosition = Vector3.zero;
//加载所有ab包
// //object []all= ab.LoadAllAssets();
// // foreach (var o in all)
// // {
// // Instantiate(o as GameObject);
// // }
}
/// <summary>
/// 第一种加载,www加载
/// </summary>
/// <returns></returns>
IEnumerator Www(string ObjName)
{
string path = "AssetBundles/" + ObjName + ".unity3d";
AssetBundleCreateRequest re = AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes(path));
yield return re;
AssetBundle ab = re.assetBundle;
GameObject tmp = ab.LoadAsset<GameObject>(ObjName);
GameObject go= Instantiate(tmp);
go.transform.parent = this.transform;
go.transform.localPosition = Vector3.zero;
}
IEnumerator WwW(string ObjName)
{
// string path = @"E:\UnityWork\MyAssetBundle\AssetBundles\" + ObjName + ".unity3d";
string path = @"http://localhost/AssetBundles/" + ObjName + ".unity3d";
while (!Caching.ready)
{
yield return null;
}
WWW www = WWW.LoadFromCacheOrDownload(path,5);
yield return www;
if (www.error!=null)
{
Debug.Log(www.error);
yield break;
}
AssetBundle ab = www.assetBundle;
GameObject tmp = ab.LoadAsset<GameObject>(ObjName);
GameObject go = Instantiate(tmp);
go.transform.parent = this.transform;
go.transform.localPosition = Vector3.zero;
}
/// <summary>
/// 第四种UnitywbeRequest
/// </summary>
/// <returns></returns>
IEnumerator UnityWbe(string ObjName)
{
string uri = @"http://localhost/AssetBundles/" + ObjName + ".unity3d";
UnityWebRequest request = UnityWebRequest.GetAssetBundle(uri);
yield return request.SendWebRequest();
// AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request);//加载多种
AssetBundle ab = (request.downloadHandler as DownloadHandlerAssetBundle).assetBundle;
// File.WriteAllBytes(); //保存
GameObject tmp = ab.LoadAsset<GameObject>(ObjName);
GameObject go = Instantiate(tmp);
go.transform.parent = this.transform;
go.transform.localPosition = Vector3.zero;
}
/// <summary>
/// 第二种方式,内存同步加载
/// </summary>
void Memory(string ObjName)
{
string path = "AssetBundles/" + ObjName + ".unity3d";
AssetBundle ab= AssetBundle.LoadFromMemory(File.ReadAllBytes(path));
GameObject tmp = ab.LoadAsset<GameObject>(ObjName);
GameObject go = Instantiate(tmp);
go.transform.parent = this.transform;
go.transform.localPosition = Vector3.zero;
}
假如两个预制体共享一个材质资源,当分别将两个预制体打成两个ab包的时候,每个ab包会将预制体依赖的材质同时打进包中,这样每个包中都会有一份材质,会导致包体变大。
因此需要将材质打包成一个ab包,然后再将两个预制体打依赖于材质ab包的ab包,这样就节省了资源。
题外话:初学者对英文文档的阅读能力要求不高,但是想要在程序的路上越走越远的话,就需要能看懂一些英文文档。
1.依赖包重复问题
把需要共享的资源打包到一起
分割包,这些包不是同一时间使用的
把共享的部分打包成一个单独的包
2.图集重复问题
文件校验
CRC MD5 SHA1
通过对数据进行计算,来生成一个校验值,该校验值用来检验数据的完整性
1.算法不同。CRC采用多项式除法,MD5和SHA1使用的是替换、轮转等方法
2.校验值长度不同。CRC长度一般跟其多项式有关,一般16位或32位;MD5是16字节(128位);SHA1是20个字节(160位)
3.校验值的称呼不同。CRC叫CRC值 MD5和SHA1一般叫Hash或散列值
4.安全性不同。这里的安全性是指验错能力,即数据的错误能通过校验检测出来。CRC的安全性跟多项式有关系,相对于MD5 SHA1要弱;MD5安全性高,但是被破解了。SHA1安全性最高
5.效率不同CRC的计算效率很高;MD5 SHA1比较慢
6.用途不同 CRC一般用作通信数据的校验:MD5和SHA1用于安全领域,比如文件校验、数字签名等