Unity3d常用兩種加載資源方案:Resources.Load和AssetBundle

初步整理并且學習unity3d資源加載方法,預計用時兩天完成入門學習Unity3d常用兩種加載資源方案:Resources.Load和AssetBundle

Resources.Load就是從一個缺省打進程序包里的AssetBundle里加載資源而一般AssetBundle文件需要你自己創建,運行時動態加載,

可以指定路徑和來源的。其實場景里所有靜態的對象也有這么一個加載過程,只是Unity后臺替你自動完成

一:Resources.Load:使用這種方式加載資源,首先需要下Asset目錄下創建一個名為Resources的文件夾,這個命名是U3D規定的方式,然后把資源文件放進去,

當然也可以在Resources中再創建子文件夾,當然在代碼加載時需要添加相應的資源路徑,下面是一個簡demo,兩個預設,Cube和Sphere,

其中Cube放在Resource中的Prebs中,而Sphere放在Resources跟目錄下,下面分別實現Resources.Load資源的加載

復制代碼
using UnityEngine;
using System.Collections;

public class LoadResDemo : MonoBehaviour {

private string cubePath = "Prebs/MyCubePreb";
private string spherePath = "MySpherePreb";
void Start () {
    //把資源加載到內存中
    Object  cubePreb = Resources.Load(cubePath, typeof(GameObject));
    //用加載得到的資源對象,實例化游戲對象,實現游戲物體的動態加載
    GameObject cube = Instantiate(cubePreb) as GameObject;



    //以下同理實現Sphere的動態實例化
    //把資源加載到內存中
    Object spherePreb = Resources.Load(spherePath, typeof(GameObject));
    //用加載得到的資源對象,實例化游戲對象,實現游戲物體的動態加載
    GameObject sphere = Instantiate(spherePreb) as GameObject;
}

void Update () {

}

}
復制代碼
  將上面的腳本附加到某個游戲對象上,在運行游戲時就可以看到場景中動態創建的上面的游戲對象了

上面是第一種使用Resources.Load()的方式動態加載游戲對象的,然而在項目中更長用的卻是第二種使用AssetBundle的方式動態加載游戲對象。

使用AssetBundle打包預設或者場景可以將與其相關的所有資源打包,這樣很好地解決資源的依賴問題,使得我們可以方便的加載GameObject

首先需要打包資源:

復制代碼
using UnityEngine;
using System.Collections;
using UnityEditor;
using System.IO;
public class AesstBundleTest : MonoBehaviour {

[MenuItem("Custom Bundle/Create Bundel Main")]
public static void creatBundleMain()
{
    //獲取選擇的對象的路徑
    Object[] os = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);
    bool isExist = Directory.Exists(Application.dataPath + "/StreamingAssets");
    if (!isExist)
    {
        Directory.CreateDirectory(Application.dataPath + "/StreamingAssets");
    }
    foreach (Object o in os)
    {
        string sourcePath = AssetDatabase.GetAssetPath(o);

        string targetPath = Application.dataPath + "/StreamingAssets/" + o.name + ".assetbundle";
        if (BuildPipeline.BuildAssetBundle(o, null, targetPath, BuildAssetBundleOptions.CollectDependencies))
        {
            print("create bundle cuccess!");
        }
        else
        {
            print("failure happen");
        }
        AssetDatabase.Refresh();
    }
}
[MenuItem("Custom Bundle/Create Bundle All")]
public static void CreateBundleAll()
{
    bool isExist = Directory.Exists(Application.dataPath + "/StreamingAssets");
    if (!isExist)
    {
        Directory.CreateDirectory(Application.dataPath + "/StreamingAssets");
    }
    Object[] os = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);
    if (os == null || os.Length == 0)
    {
        return;
    }
    string targetPath = Application.dataPath + "/StreamingAssets/" + "All.assetbundle";
    if (BuildPipeline.BuildAssetBundle(null, os, targetPath, BuildAssetBundleOptions.CollectDependencies))
    {
        print("create bundle all cuccess");
    }
    else
    {
        print("failure happen");
    }
    AssetDatabase.Refresh();
}

}
復制代碼
把上面的代碼放在Editor中,在菜單欄中就可以看見自定的菜單項,選中需要打包的預設,就可以把對應的預設打包并輸出到StreamAssets中了

然后是動態加載資源:

復制代碼
using UnityEngine;
using System.Collections;

public class LoadBundleTest : MonoBehaviour {
//不同平臺下StreamingAssets的路徑是不同的,這里需要注意一下。
public static readonly string PathURL =
#if UNITY_ANDROID
"jar:file://" + Application.dataPath + "!/assets/";
#elif UNITY_IPHONE
Application.dataPath + "/Raw/";
#elif UNITY_STANDALONE_WIN || UNITY_EDITOR
"file://" + Application.dataPath + "/StreamingAssets/";
#else
string.Empty;
#endif

// Update is called once per frame
void Update () {

}

void OnGUI()
{
    if (GUILayout.Button("Load Bundle Main"))
    {
        string path_shpere = PathURL + "MySpherePreb.assetbundle";
        StartCoroutine(loadBundleMain(path_shpere));

        string path_cube = PathURL + "MyCubePreb.assetbundle";
        StartCoroutine(loadBundleMain(path_cube));
        print(path_cube);
    }

    if (GUILayout.Button("Load Bundle All"))
    {
        StartCoroutine(loadBundleAll(PathURL + "All.assetbundle"));
    }
}


private IEnumerator loadBundleMain(string path)
{
    WWW bundle = new WWW(path);
  //  yield return bundle;
     Instantiate(bundle.assetBundle.mainAsset);
     bundle.assetBundle.Unload(false);
     yield return 1;
}

private IEnumerator loadBundleAll(string path)
{
    WWW bundle = new WWW(path);
    yield return bundle;
    Instantiate(bundle.assetBundle.Load("MyCubePreb"));
    Instantiate(bundle.assetBundle.Load("MySpherePreb"));
    yield return 1;
}

}
復制代碼

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,182評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,489評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,290評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,776評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,510評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,866評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,860評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,036評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,585評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,331評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,536評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,058評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,754評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,154評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,469評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,273評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,505評論 2 379

推薦閱讀更多精彩內容