赞
踩
代码中变量使用public修饰符,在unity面板中将需要的资源拖拽上进行赋值 。(一般用于个人测试或者Demo中,如果不小心遇到Unity崩溃或者物体上的脚本丢失情况则需要重新拖拽,非常不利于项目开发)
Resources文件夹文件大小上限大概为两个G左右,所以可以将一些配置表放在中间进行加载。小型项目、demo可以使用此加载方式。
代码使用Resources.load<资源类型>(“资源路径”);进行加载
在编辑器内加载卸载资源,并不能在游戏发布时使用,它只能在编辑器内使用。但是,它加载速度快,效率高,适合在测试时使用。
#if UNITY_EDITOR
using UnityEditor;
#endif
using System.Collections;
public class LoadingRec : MonoBehaviour {
#if UNITY_EDITOR
public void Loading()
{
Material mat = AssetDatabase.LoadAssetAtPath<Material>("Assets/red.mat");
}
#endif
}
注意:在编辑器内的使用需要加上一个宏(包括命名空间和代码),否则发布时有可能会报错
步骤一:指定资源的AssetBundle属性
需要打包的资源加上ab包名和后缀(后缀可加也可不加)
步骤二:构建AssetBundle包
创建打包工具类,Project面板创建Editor文件夹(Editor文件夹的作用这里简单介绍下,1:发布时不会被打进包里 2:一般开发时创建的编辑器工具脚本都会放在此文件夹下…详细其它作用可以自行百度)——》创建工具类BundleEditor名字自己取——》编写代码:
``
经验总结:
4. 把经常更新的资源放在一个单独的包里面,跟不经常更新的包分离
5. 把需要同时加载的资源放在一个包里面
6. 可以把其他包共享的资源放在一个单独的包里面
7. 把一些需要同时加载的小资源打包成一个包
8. 如果对于一个同一个资源有两个版本,可以考虑通过后缀来区分 v1 v2 v3 unity3dv1 unity3dv2
注意使用LZ4压缩,可以获得可以跟不压缩想媲美的加载速度,而且比不压缩文件要小。
//第一种加载AB的方式 LoadFromMemoryAsync
//AssetBundleCreateRequest request = AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes(path));
//yield return request;
//AssetBundle ab = request.assetBundle;
//AssetBundle ab = AssetBundle.LoadFromMemory(File.ReadAllBytes(path));
//AssetBundleCreateRequest request = AssetBundle.LoadFromFileAsync(path);
//yield return request;
//AssetBundle ab = request.assetBundle;
//while(Caching.ready == false)
//{
// yield return null;
//}
file:// file:///
WWW www = WWW.LoadFromCacheOrDownload(@"file:/E:\Unity Project Workspace\AssetBundleProject\AssetBundles\cubewall.unity3d", 1);
//WWW www = WWW.LoadFromCacheOrDownload(@"http://localhost/AssetBundles/cubewall.unity3d", 1);
//yield return www;
//if ( string.IsNullOrEmpty(www.error)==false )
//{
// Debug.Log(www.error);yield break ;
//}
//AssetBundle ab = www.assetBundle;
//string uri = @"file:///E:\Unity Project Workspace\AssetBundleProject\AssetBundles\cubewall.unity3d"; string uri = @"http://localhost/AssetBundles/cubewall.unity3d"; UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(uri); yield return request.Send(); //AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request); AssetBundle ab = (request.downloadHandler as DownloadHandlerAssetBundle).assetBundle; //使用里面的资源 GameObject wallPrefab = ab.LoadAsset<GameObject>("CubeWall"); Instantiate(wallPrefab); AssetBundle manifestAB = AssetBundle.LoadFromFile("AssetBundles/AssetBundles"); AssetBundleManifest manifest = manifestAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest"); //foreach(string name in manifest.GetAllAssetBundles()) //{ // print(name); //} string[] strs = manifest.GetAllDependencies("cubewall.unity3d"); foreach (string name in strs) { print(name); AssetBundle.LoadFromFile("AssetBundles/" + name); }
一般:
T objectFormBundle=bundleObject.LoadAsset(assetName);
GameObject:
GameObject gb=loadedAssetBundle.LoadAsset(assetName);
所有资源
Unity.Object[] objectArray=loadedAssetBundle.LoadAllAssets();
加载manifests文件可以处理资源的依赖
AssetBundle assetBundle=AssetBundle.LoadFromFile(manifestfilePath);
AssetBundleManifest manifest=assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManaifest");
string[] dependencies = manifest.GetAllDependencies("assetBundle"); //Pass the name of the bundle you want the dependencies for.
foreach(string dependency in dependencies)
{
AssetBundle.LoadFromFile(Path.Combine(assetBundlePath, dependency));
}
卸载有两个方面:
AssetBundle.Unload(true)卸载所有资源,即使有资源被使用着(比如在关卡切换、场景切换时;资源没有被用的时候调用)
AssetBundle.Unload(false) 卸载所有没有被使用的资源 单个资源使用Resources.UnLoadUnusedAssets()
CRC MD5 SHA1
相同点:
CRC、MD5、SHA1都是通过对数据进行计算,来生成一个校验值,该校验值用来校验数据的完整性。
不同点:
可能会遇到的问题:
1,依赖包重复问题
a,把需要共享的资源打包到一起
b,分割包,这些包不是在同一时间使用的
c,把共享部分打包成一个单独的包
2,图集重复问题
3,Android贴图问题
4,iOS文件处理重复fixed in Unity 5.3.2p2.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。