第一種方法,從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吧