Assetbundle为资源包不是资源
打包1:通过脚本指定打包
AssetBundleBuild ab = new AssetBundleBuild
{
assetBundleName =
PlayerSettings.bundleVersion + "@" + "zhao",//资源包assets的名字
assetNames = new string[1], //包里的每个资源的名字
};
string outputPath = Path.Combine(Utility.AssetBundlesOutputPath, Utility.GetPlatformName());
BuildPipeline.BuildAssetBundles(assetBundlePath, new[] { ab });//打包 assetBundlePath保存 路径 打包的资源
打包2:在unity3d中更改打包
在unity3d中会自动检测有更改这个的时候去选择打包所有已经命名的资源,形成一个资源包assetbundle
BuildPipeline.BuildAssetBundles(assetBundlePath, BuildAssetBundleOptions.None, EditorUserBuildSettings.activeBuildTarget);//路径,打包选择的压缩方式,选择打包的指定平台
打包后会生成4个文件(我打包 时的名字是cube.ab后缀名可以自己取,aa,bb,dd都行不影响)
其中cube.ab是assetbundle文件,后缀名为manifest的是一个相当于配置文件一样的,这个就是拿来看看的,不用管(加载时也不需要)
当加载的时候只需要用到cube.ab 这里包含资源和资源的依赖(解释依赖:就是这个资源所需要的东西,比如一个prefab它需要有一个纹理mat,而当这个纹理又依赖一张图)
最后在解释打包后生成的AssetBundle
这个名字也是由我们而定这几个文件的作用和cube.ab差不多
区别在与assetbundle中包含有资源包的依赖关系(是不是发现就是大家所说的总的依赖关系!)
/////////////////////////////////////////////////////////////////////////////////
加载1:本地加载(没有依赖的asssetbundle)
WWW windowswww = new WWW("file://" + Application.dataPath + "/AssetBundle/AssetBundle");//Application.dataPath 当前工程目录
yield return windowswww;
AssetBundleManifest windowsasset = windowswww.assetBundle.LoadAsset("AssetBundleManifest") as AssetBundleManifest;//这里对于新手来说特别重要!
/*我们去www请求东西的时候是不是会看到上图我断点的地方,mainasset为null
*我们加载的东西不再这里,我们的资源包里是在断点里看不到资源的
*需要通过这样的方式去加载windowswww.assetBundle.LoadAsset("AssetBundleManifest")就是这个AssetBundleManifest
*当分清这个的时候就发现网上其他的教程就完全行的通了,windowsasset 不在为null
*/
WWW cubewww = new WWW("file://" + Application.dataPath + "/AssetBundle/cube.ab");//加载完总的依赖后,就可以进一步加载我们需要的资源包了
yield return cubewww;
GameObject obj = cubewww.assetBundle.LoadAsset("vvvv@.prefab") as GameObject;//然后在加载完资源包后,就可以通过loadasset的方法去load出我们的资源
Instantiate(obj);
加载2:网络加载(含有依赖一个cube(有prefab,mat,texture))
我因为需要更深的测试所有采用WWW.LoadFromCacheOrDownload的方式加载
WWW www = WWW.LoadFromCacheOrDownload(murl + objname, 2);//murl服务器地址 包名,版本号
重点解释一下版本号和WWW.LoadFromCacheOrDownload这里讲一下这个方法在使用的时候会自行保存到本地
WWW.LoadFromCacheOrDownload这个方法的的意思是当进行加载的时候会检查本地目录(本地目录为PC上为C:\Documents and Settings\Administrator\Local Settings\Application Data\Unity\WebPlayer\Cache\DefaultCompany_XXXX是工程的名字,因为有些人的电脑名字为中文等等,,,然后这个目录不一定都一样,就慢慢找吧,其他平台的我不一一指出了)如果有而且版本号对应,就会优先使用本地的,
而这个版本号:
准备测试
有三个cube 分别为1红色,2黄色,3绿色
版本号 | 本地资源 | 服务器资源 | 服务器状态 | 结果 |
0 | 无 | 红 | 开 | 红 |
0 | 红 | 红 | 关 | 红 |
1 | 红 | 黄 | 开 | 黄 |
1 | 红,黄 | 黄 | 关 | 黄 |
0 | 红,黄 | 绿 | 开 | 红 |
1 | 红,黄 | 绿 | 开 | 黄 |
2 | 红,黄 | 绿 | 开 | 绿 |
这里可以看出来,版本号在我们打包的时候unity并没有提供去参与打包。
而是在第一次加载的时候加载的时候会写入一个版本号然后存到本地?然后在去请求的时候进行版本号的对比然后在去选择读服务器上的还是读本地的。这点,我也是有进行猜测,高手望指出
WWW www = LoadWww("AssetBundle");//load是我写方法 WWW www = WWW.LoadFromCacheOrDownload(murl + objname, 0);返回www
yield return www;
if (!string.IsNullOrEmpty(www.error))//当这个有信息的时候是错误信息
{
Debug.Log("错误信息为:" + www.error);
}
else
{
AssetBundleManifest assetbundlemani = www.assetBundle.LoadAsset("AssetBundleManifest") as AssetBundleManifest;//得到总的依赖
if (assetbundlemani != null)
{
List<String> manifest = assetbundlemani.GetAllDependencies("cube.ab").ToList();//得到这个cube.ab的所有依赖资源包
foreach (string s in manifest)//进行每个加载
{
WWW sw = this.LoadWww(s);
yield return sw;
sw.assetBundle.LoadAsset(s);//每个资源都load出来
}
WWW objwww = this.LoadWww("cube.ab");//cube资源依赖加载完后
yield return objwww;
GameObject assetobj = objwww.assetBundle.LoadAsset("vvvv@") as GameObject;//直接load就可以了
if (assetobj != null)
{
Instantiate(assetobj);
}
}
1,加载总依赖assetbundle
2,load出需要的cube资源包依赖
3,加载cube所依赖的资源
4,加载cube
5,使用cube
在unity3d新的assetbundle打包中,所有的依赖unity3d都帮我们做好,我只要把所要加载的资源和它所依赖的资源加载出来,unity3d也帮我们组合好,直接就可以使用了。
ps:场景可以打包,文件夹也可以打包。
本人水平有限,有什么错误的地方望大神们指出