1. 程式人生 > >Unity打包內部prefab和讀取外部assetbundle的方法詳解。

Unity打包內部prefab和讀取外部assetbundle的方法詳解。

首先要在資料夾內建立Editor資料夾,把指令碼CreateAssetBundle.cs放進去。指令碼如下

using UnityEngine;
using UnityEditor;
using System.Collections;

public class CreateAssetBundle : MonoBehaviour {
///
/// 將選中的預製分別打包
///
[MenuItem(“開始資源打包/Create AssetBundles By themselves”)]
static void CreateAssetBundleThemelves()
{
//獲取要打包的物件(在Project檢視中)
Object[] selects = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);
//遍歷選中的物件
foreach (Object obj in selects)
{
//這裡建立一個本地測試
//注意本地測試中可以是任意的檔案,但是到了移動平臺只能讀取路徑StreamingAssets裡面的
//StreamingAssets是隻讀路徑,不能寫入
string targetPath = “D:\virtual mirror\FBX\” + obj.name + “.assetbundle”;//輸出

到的檔案的字尾名是assetbundle和unity都可以
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();
}

}

打包場景的程式碼如下:
[MenuItem(“Custom Editor/Create Scene”)]
static void CreateSceneALL ()
{
//清空一下快取
Caching.CleanCache();
string Path = Application.dataPath + “/MyScene.unity3d”;
string []levels = {“Assets/Level.unity”};
//打包場景
BuildPipeline.BuildPlayer( levels, Path,BuildTarget.WebPlayer, BuildOptions.BuildAdditionalStreamedScenes);
AssetDatabase.Refresh ();
}

讀取的Assetbundle的指令碼如下:

using UnityEngine;
using System.IO;
using System.Collections;

public class ScenesManager : MonoBehaviour {
private string DownUrl;
private string FBXname;
private string PrizeURL;
// public static readonly string DownUrl =
//#if UNITY_ANDROID
// “jar:file://” + Application.dataPath + “!/assets/”;
//#elif UNITY_IPHONE
// Application.dataPath + “/Raw/”;
//#elif UNITY_STANDALONE_WIN || UNITY_EDITOR
// “file://” + System.Environment.CurrentDirectory + “\weiyi(hou).assetbundle”;
//#else
// string.Empty;
//#endif
void Awake()
{
PrizeURL = “D:\virtual mirror\FBXname\FBXname.txt”; //自動獲取當前檔案在系統中的

路徑
FBXname = ReadFile(PrizeURL, 4, 1); //第一行資訊

}
void Start () {
    DownUrl = "file://D:\\virtual mirror\\FBX\\" + FBXname + ".assetbundle";
    //Debug.Log("FBXname=" + FBXname);
    //Debug.Log("DownUrl=" + DownUrl);
}
void Update () {
    DownLoadPrefab();
}
string ReadFile(string FileName, int linenumber, int line)
{
    string[] strs = File.ReadAllLines(FileName);  //讀取所有行資訊
    if (linenumber == 0)
    {
        return "";
    }
    else
    {
        return strs[linenumber - line];
        //返回特定一行的資訊  
    }
}
void DownLoadPrefab()
{
    if (Input.GetKeyDown(KeyCode.Q))
    {
        StartCoroutine(DownPrefabMethod1(DownUrl));
    }
}
IEnumerator DownPrefabMethod1(string Url)
{
    WWW www = new WWW(Url);
    yield return www;
    GameObject ClonePrefab = Instantiate(www.assetBundle).LoadAsset(FBXname, typeof

(GameObject)) as GameObject;
Instantiate(ClonePrefab);
www.assetBundle.Unload(false);
}

}

操作步驟為:
1、提前把要打包的檔案做成預設prefab;
2、選中需要打包的預設prefab,點選Unity介面上方工具欄按鈕‘開始資源打包/Create AssetBundles By

themselves’,此時選中的檔案會自動打包成assetbundle檔案在你所設定的路徑中。
3、在TXT文件中寫入了assetbundle包名稱,指令碼中會自動讀取對應行數的名稱而進行解包,解包完成後可執

行相關操作。最後不要忘記載入完assetbundle後要及時釋放: www.assetBundle.Unload(false); 以免再

次提取檔案時出錯。

這只是打包單一檔案的方法,後續會增加多個檔案打包到一個assetbundle中,讀取指定檔案的方法。

今天下午的功夫就用來研究這個了,不過總算不辜所託,小夥伴們有更高的方法歡迎在下方評論區提出。