Unity學習筆記(5):動態加載Prefab


第一種方法,從Resources文件夾讀取Prefab
Assets/Resources文件夾是Unity中的一個特殊文件夾,在博主當前的認知里,放在這個文件夾里的Prefab可以被代碼動態加載
直接上代碼

GameObject Prefab = (GameObject)Resources.Load("Prefabs/Character");
Instantiate(Prefab);

第二種方法,絕對路徑讀取Prefab
這種方法僅限Editor模式使用,在制作插件的時候會經常用到

GameObject gb = AssetDatabase.LoadAssetAtPath("Assets/Prefabs/Character.prefab", typeof(GameObject)) as GameObject;
Instantiate(gb)

Resources.Load函數返回一個object對象,第一個參數為以Resources為根目錄,目標Prefab的路徑,第二個參數為Prefab的名字,最后將這個object對象強轉成(GameObjcet)就可以獲得Prefab了
第三種方法,把Prefab打包成AssetBundle並且使用AssetBundle相關API動態加載

1.首先在資源管理器中找到你想打包的Prefab,找到Inspector頁面下面的Asset_Labels,打開
在這里插入圖片描述
發現AssetBundle后面有兩個選項,第一個選項為AssetBundle的包名,第二個選項為包的后綴名,自定義你想要的包名和后綴,將想要打在一個包的資源的AssetBundle的包名和后綴設置成一樣的
2.編寫AssetBundle生成工具
在Asset下創建文件夾Plugins,再在Plugins下創建文件夾Editor,在Plugins/Editor下創建腳本CreateAssetBundles.cs
Plugins/Editor和Resource一樣是特殊路徑,在Plugins下的腳本的編譯優先級高於普通腳本。

CreateAssetBundles.cs:

using UnityEditor;
using System.IO;

public class CreateAssetBundles {
    //設定AssetBundle的儲存路徑
    static string AssetbundlePath = "Assets" + Path.DirectorySeparatorChar + "assetbundles" + Path.DirectorySeparatorChar;
    //編輯器擴展
    [MenuItem("Assets/Build AssetBundle")]
    static void BuildAssetsBundles()
    {
        //創建路徑
        if (Directory.Exists(AssetbundlePath) == false)
        {
            Directory.CreateDirectory(AssetbundlePath);
        }
        //使用LZMA算法打包
        BuildPipeline.BuildAssetBundles(AssetbundlePath, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
    }
}

BuildPipeline.BuildAssetBundles的第二個參數是打包的壓縮方式
有三個可選參數
BuildAssetBundleOptions.None LZMA算法壓縮,壓縮包小,加載慢
BuildAssetBundleOptions.UncompressedAssetBundle; 不壓縮,包大,加載快
BuildAssetBundleOptions.ChunkBasedCompression LZ4壓縮,壓縮率比LZMA低,可以加載指定資源不用解壓全部

保存
回到Unity Editor,點擊Assets可以看到最下面出現了Build AssetBundle選項,點擊Build AssetBundle,打包
在這里插入圖片描述
打包完成后可以在剛剛設置的AssetBundle所在路徑找到幾個文件
在這里插入圖片描述
這幾個文件具體是什么暫時不討論
3.加載Prefab
創建腳本AssetBundleLoader.cs
AssetBundleLoader.cs:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AssetBundleLoader
{
    //參數1是AssetBundle的路徑,參數2是資源的名稱
	public static GameObject LoadAssetBundle(string Path, string Name)
    {
        //1.卸載數據,如果有某個系統來管理加載好的數據就不要加下面這句了
        AssetBundle.UnloadAllAssetBundles(true);

        //2.加載數據
        AssetBundle ab = AssetBundle.LoadFromFile(Path);

        return ab.LoadAsset<GameObject>(Name);
    }
}

可以通過AssetBundleLoader.LoadAssetBundle(string, string)來加載Prefab等資源,關於這個函數要不要先卸載AssetBundle,這取決於你的框架是否只需要加載一次這個包,並且有一個管理這些資源的系統,我這種做法無疑是降低效率的(其實就是懶得再搭個系統),根據實際情況用不同的方式來加載AssetBundle吧


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM