Unity C#打包AssetBundle與場(chǎng)景詳解
Unity2018已經(jīng)把打包過(guò)程簡(jiǎn)化很多了
我們只需要關(guān)心兩個(gè)API:
1.BuildPipline.BuildAssetBundles() 打包AssetBundle
2.BuildPipline.BuildPlayer() 打包場(chǎng)景
1.打包AssetBundle
先在資源的Inspector面板最下方 填寫(xiě)資源所屬的AssetBundle名稱(chēng)和后綴(后綴可以不填)
再利用BuildPipeline.BuildAssetBundles()進(jìn)行打包

2.打包Scene
利用BuildPipeline.BuildPlayer()進(jìn)行打包
為方便使用 先把要打包的場(chǎng)景放入指定的文件夾 通過(guò)腳本批量打包

3.腳本批量打包

4.打包完畢

5.加載測(cè)試

6.打包和測(cè)試腳本
AssetBundleBuilder.cs
using UnityEngine;
using UnityEditor;
using System.IO;
/// <summary>
/// 資源包打包工具
/// <para>打包AssetBundle和場(chǎng)景(Unity 2018.2.20)</para>
/// <para>ZhangYu 2019-02-26</para>
/// </summary>
public class AssetBundleBuilder
{
[MenuItem("打包/Windows/資源包和場(chǎng)景")]
public static void BuildAbsAndScenesWindows() {
BuildAbsAndScenes(BuildTarget.StandaloneWindows);
}
[MenuItem("打包/Android/資源包和場(chǎng)景")]
public static void BuildAbsAndScenesAndroid() {
BuildAbsAndScenes(BuildTarget.Android);
}
[MenuItem("打包/IOS/資源包和場(chǎng)景")]
public static void BuildAbsAndScenesIOS() {
BuildAbsAndScenes(BuildTarget.iOS);
}
[MenuItem("打包/Windows/資源包")]
public static void BuildAbsWindows() {
BuildAssetBundles(BuildTarget.StandaloneWindows);
}
[MenuItem("打包/Android/資源包")]
public static void BuildAbsAndroid() {
BuildAssetBundles(BuildTarget.Android);
}
[MenuItem("打包/IOS/資源包")]
public static void BuildAbsIOS() {
BuildAssetBundles(BuildTarget.iOS);
}
[MenuItem("打包/Windows/場(chǎng)景")]
public static void BuildScenesWindows() {
BuildScenes(BuildTarget.StandaloneWindows);
}
[MenuItem("打包/Android/場(chǎng)景")]
public static void BuildScenesAndroid() {
BuildScenes(BuildTarget.Android);
}
[MenuItem("打包/IOS/場(chǎng)景")]
public static void BuildScenesIOS() {
BuildScenes(BuildTarget.iOS);
}
// 打包AssetBundle和Scenes
public static void BuildAbsAndScenes(BuildTarget platform) {
BuildAssetBundles(platform);
BuildScenes(platform);
}
// 打包AssetBundles
private static void BuildAssetBundles(BuildTarget platform) {
// 輸出路徑
string outPath = Application.streamingAssetsPath + "/Abs";
if (!Directory.Exists(outPath)) Directory.CreateDirectory(outPath);
EditorUtility.DisplayProgressBar("信息", "打包資源包", 0f);
BuildPipeline.BuildAssetBundles(outPath, BuildAssetBundleOptions.DeterministicAssetBundle, platform);
AssetDatabase.Refresh();
Debug.Log("所有資源包打包完畢");
}
// 打包Scenes
private static void BuildScenes(BuildTarget platform) {
// 指定場(chǎng)景文件夾和輸出路徑
string scenePath = Application.dataPath + "/AbResources/Scenes";
string outPath = Application.streamingAssetsPath + "/Abs/";
if (Directory.Exists(scenePath)) {
// 創(chuàng)建輸出文件夾
if (!Directory.Exists(outPath)) Directory.CreateDirectory(outPath);
// 查找指定目錄下的場(chǎng)景文件
string[] scenes = GetAllFiles(scenePath, "*.unity");
for (int i = 0; i < scenes.Length; i++) {
string url = scenes[i].Replace("\\", "/");
int index = url.LastIndexOf("/");
string scene = url.Substring(index + 1, url.Length - index - 1);
string msg = string.Format("打包場(chǎng)景{0}", scene);
EditorUtility.DisplayProgressBar("信息", msg, 0f);
scene = scene.Replace(".unity", ".scene");
Debug.Log(string.Format("打包場(chǎng)景{0}到{1}", url, outPath + scene));
BuildPipeline.BuildPlayer(scenes, outPath + scene, BuildTarget.StandaloneWindows, BuildOptions.BuildAdditionalStreamedScenes);
AssetDatabase.Refresh();
}
EditorUtility.ClearProgressBar();
Debug.Log("所有場(chǎng)景打包完畢");
}
}
/// <summary> 獲取文件夾和子文件夾下所有指定類(lèi)型文件 </summary>
private static string[] GetAllFiles(string directory, params string[] types) {
if (!Directory.Exists(directory)) return new string[0];
string searchTypes = (types == null || types.Length == 0) ? "*.*" : string.Join("|", types);
string[] names = Directory.GetFiles(directory, searchTypes, SearchOption.AllDirectories);
return names;
}
}
LoadTest.cs
using UnityEngine;
using UnityEngine.SceneManagement;
public class LoadTest : MonoBehaviour {
private void Start () {
LoadAB();
LoadScene();
}
// 加載資源包
private void LoadAB() {
// 資源包路徑
string path = Application.streamingAssetsPath + "/Abs/test.ab";
// WWW下載
Http http = gameObject.AddComponent<Http>();
http.get(path, OnLoadABComplete);
}
// 加載場(chǎng)景
private void LoadScene() {
// 資源包路徑
string path = Application.streamingAssetsPath + "/Abs/Test.scene";
// WWW下載
Http http = gameObject.AddComponent<Http>();
http.get(path, OnLoadSceneComplete);
}
// 加載AssetBundle完畢
private void OnLoadABComplete(WWW www) {
// 實(shí)例化預(yù)制
AssetBundle ab = www.assetBundle;
Object prefab = ab.LoadAsset("Test");
GameObject instance = (GameObject)Instantiate(prefab);
DontDestroyOnLoad(instance);
}
// 加載場(chǎng)景完畢
private void OnLoadSceneComplete(WWW www) {
// 必須寫(xiě)www.assetBundle這句 這樣場(chǎng)景才能被讀取到
AssetBundle ab = www.assetBundle;
SceneManager.LoadScene("Test");
}
}
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
C#實(shí)現(xiàn)更快讀寫(xiě)超級(jí)大文件的方法詳解
這篇文章主要來(lái)和大家介紹一下C#實(shí)現(xiàn)更快讀寫(xiě)超級(jí)大文件的方法,文中的示例代碼簡(jiǎn)潔易懂,對(duì)我們深入了解C#有一定的幫助,快跟隨小編一起學(xué)習(xí)起來(lái)吧2023-06-06
c# WPF實(shí)現(xiàn)Windows資源管理器(附源碼)
這篇文章主要介紹了c# WPF實(shí)現(xiàn)Windows資源管理器的示例(附源碼),幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-03-03
深入學(xué)習(xí)C#網(wǎng)絡(luò)編程之HTTP應(yīng)用編程(上)
這篇文章主要介紹了如何學(xué)習(xí)C#網(wǎng)絡(luò)編程之HTTP應(yīng)用編程的相關(guān)知識(shí),文中講解的非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-06-06
C#12中的Collection expressions集合表達(dá)式語(yǔ)法糖詳解
C#12中引入了新的語(yǔ)法糖來(lái)創(chuàng)建常見(jiàn)的集合,并且可以使用..來(lái)解構(gòu)集合,將其內(nèi)聯(lián)到另一個(gè)集合中,下面就跟隨小編一起學(xué)習(xí)一下C#12中這些語(yǔ)法糖的使用吧2023-11-11
C#中重寫(xiě)tospring方法的實(shí)現(xiàn)
重寫(xiě)ToString方法允許你自定義對(duì)象的字符串表示形式,本文主要介紹了C#中重寫(xiě)tospring方法的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-08-08

