我们首先写一个BuildAssetBundle脚本
using UnityEngine;
using System.Collections;
using UnityEditor;
using System.IO;
public class BuildAssetBundle{
/// <summary>
/// 将选中的预制分别打包
/// </summary>
[MenuItem("build/Create AssetBundles By themselves")]
static void CreateAssetBundleThemelves(){
//获取要打包的对象(在Project视图中)
Object[] selects = Selection.GetFiltered (typeof(Object),SelectionMode.DeepAssets);
//遍历选中的对象
foreach(Object obj in selects){
//string outPath=Application.streamingAssetsPath+"/AssetBundle";
//这里建立一个本地测试
//注意本地测试中可以是任意的文件,但是到了移动平台只能读取路径StreamingAssets里面的
//StreamingAssets是只读路径,不能写入
string targetPath = Application.streamingAssetsPath + "/" + obj.name + ".assetbundle";//文件的后缀名是assetbundle和unity3d都可以
if(BuildPipeline.BuildAssetBundle(obj,null,targetPath,BuildAssetBundleOptions.CollectDependencies)){
Debug.Log(obj.name + "is packed successfully!");
}else{
Debug.Log(obj.name + "is packed failly!");
}
}
//刷新编辑器(不写的话要手动刷新,否则打包的资源不能及时在Project视图内显示)
AssetDatabase.Refresh ();
}
}
这个脚本的作用是在Unity主菜单中添加一个选项卡,来给我们提供一个可视化的操作,把我们想要打包的资源打包成一个AssetsBundle的格式,该脚本必须放在Assets/Editor的文件夹下

放到下边以后我们会发现在主菜单选项卡中多了一个Bulid
注意:同时我们还必须在Assets下新建一个StreamingAssets文件夹

然后我们选中一个预制体或者资源文件,然后点击Bulid

选中红箭头指向的选项我们就会在SteamingAssets文件夹下发现我们打包好的文件

然后我们在写一个脚本把打包的AssetBundle文件给解析出来
using UnityEngine;
using System.Collections;
public class LoadAssetBundle : MonoBehaviour {
void Start () {
//需要解析的文件名,该文件必须在StreamingAssets目录下
StartCoroutine (Load("Sphere"));
}
IEnumerator Load(string path){
string str = "file://" + Application.streamingAssetsPath + "/" + path + ".assetbundle";
WWW w = new WWW (str);
yield return w;
if(w.error==null){
AssetBundle a = w.assetBundle;
GameObject.Instantiate (a.mainAsset);
}
}
// Update is called once per frame
void Update () {
}
}
然后我们把该脚本挂载在摄像机上边,我们运行看下


然后我们把程序打包成客户端运行

然后我们在打包出来的文件中修改一个东西

我们把Cube的名字换成Sphere

然后我们在点开程序运行

然后我们就会发现物体变成了Cube,这样的好处就是我们在发布一个程序后有的时候我们需要修改一些东西,如果我们用的是AssetBundle的时候,就可以直接在外部修改,没有必要在从Unity里去修改了。
网友评论