我写这篇博客的主要目的,给那些初学的unity人,以便能够清晰的了解打包的操作步骤,以及如何加载出资源。同时对于路径啦,要不要跟后缀名啦,同步加载,还是异步加载啦,等等这些给出最简单的一个版本,至于如何封装一个比较晚上的资源打包,处理依赖关系,等等真正上线游戏中运用到的加载还是有待看官自己慢慢的在项目中总结,当然我也会定期的更新博客,将自己遇到一些坑坑抖搂出来。
ok,转入正题啦~~
建立项目:
我们在层级视图新建立一个MyCube立方体,然后拖拽到右边的Project视图,得到一个预置体。下面我们为了后面的叙述,先更换下材质球,我们新建立一个材质球,更换颜色,然后将此材质球赋值给立方体的材质变量,如下所示:
ok,这个是后面要说的问题,暂时不略过哦。
接下来就是打包了,此时我有一个问题,那就是我们能不能只打包指定的资源呢?当然是可以的。于是有如下的代码:
using UnityEngine;
using System.Collections;
using UnityEditor;
using System.IO;
public class BuildAssetBundle
{
[MenuItem("xxxx/Build")]
static void BuildAssetBuild()
{
string outDir = "Bundles";
if(!Directory.Exists(outDir))
{
Directory.CreateDirectory(outDir);
}
AssetBundleBuild[] buildMap = new AssetBundleBuild[1]; //建立一个容器数组
buildMap[0].assetBundleName = "MyCube"; <span style="white-space:pre"> //给最终生成的AssetBundle起一个名字,你随意哈。
string[] assets = new string[1]; <span style="white-space:pre"> //此AssetBundle里面,我们打包了一个prefab
assets[0] = @"Assets\MyCube.prefab";<span style="white-space:pre"> <span style="white-space:pre"> </span>//写prefab的完整路径,相对于Assets的
buildMap[0].assetNames = assets;<span style="white-space:pre"> //将资源字符串赋值给第一个容器的assetNames属性
BuildPipeline.BuildAssetBundles(outDir, buildMap, BuildAssetBundleOptions.None, EditorUserBuildSettings.activeBuildTarget);
}
}
不好意思哈,我这里的命名很不规范,主要想展示下,任意性,嘿嘿。。。
此时,我们的Unity工具栏,就会多一个选项了:
这样,我们点击之后,就可以生成AssetBundle了。
此时文件夹Bundles下的mycube就是我们的资源包喽!亲,它里面可以包含多个prefab,以及贴图啦,脚本啦等等。
有了包,那么就是讲解下加载到实例化的过程了。
using UnityEngine;
using System.Collections;
public class NewBehaviourScript : MonoBehaviour
{
void Start()
{
StartCoroutine(LoadAssetBundle());
}
IEnumerator LoadAssetBundle()
{
string assetBundlePath = @"file:\"+Application.dataPath + @"\..\Bundles\MyCube"; //这里不要忘记使用file:\开头呦,有的博客写的是file:\\,第一个\是
WWW www = new WWW(assetBundlePath);<span style="white-space:pre"> </span> //转义符号,我们这里使用的是@代替了,所以写一个即可。
while(!www.isDone)
{
Debug.Log("正在加载assetbundle,请稍等!");
yield return null;
}
Debug.Log("assset bundle is loaded.");
//1, 列出包里有哪些资源
AssetBundle assetBundle = www.assetBundle;
string[] assetNames = assetBundle.GetAllAssetNames();
for(int i=0;i<assetNames.Length;++i)
{
Debug.Log(assetNames[i]);
}
//2,使用异步加载得到prefab
AssetBundleRequest request = assetBundle.LoadAssetAsync("MyCube", typeof(GameObject)); //这里写不写后缀名都行,比如MyCube.prefab亦可。
while (!request.isDone)
{
Debug.Log("具体的资源还没有加载完毕!");
yield return null;
}
GameObject go = Instantiate(request.asset) as GameObject;
go.name = "xxxx";
//3,使用同步加载得到prefab
GameObject go2 = (GameObject)assetBundle.LoadAsset("MyCube", typeof(GameObject)); <span style="font-family: Arial, Helvetica, sans-serif;">//这里写不写后缀名都行,比如MyCube.prefab亦可。</span>
GameObject newGo = Instantiate(go2) as GameObject;
newGo.name = "xxx";
}
}