Unity AssetBundle詳解

簡介

AssetBundle(簡稱:AB包)?是 Unity 提供的一種資源壓縮包,用于在應用運行時動態地加載和卸載資源。它可以將非代碼資源(如模型、紋理、預制體、音頻、甚至整個場景)打包成一個或多個文件,這些文件可以存放在本地或遠程服務器上。(不支持打包C#腳本

AB包的創建

AssetBundles Browser 打包工具

下載安裝

GitHub下載地址:GitHub - Unity-Technologies/AssetBundles-Browser: Editor tool for viewing and debugging asset bundle contents before and after builds

1、在Unity工程中創建文件夾Editor

2、將刪除資源包中Tests文件夾后放入到Editor文件夾中

3、確認是否安裝成功

打開Window=>AssetBundle Browser

資源打包

1、標記資源

選中資源,在Inspector面板進行Assetbundle標記。可以自定義包名和資源擴展名。AssetBundle的名字固定為小寫,如果在名字中使用了大寫字母,系統會自動轉換為小寫格式。另外,每個AssetBundle都可以設置一個擴展名。如果需要區別素材,可使用擴展名來加以區分。要添加子文件夾,請用 / 分隔文件夾名稱。例如,使用 AssetBundle 名稱 environment/forest 在 environment 子文件夾下創建名為 forest 的捆綁包。

2、資源設置

打開AssetBundle Browser窗口,可以看見已經標記過的AB包信息

3、了解Bulid面板

參數

描述

Build Target

選擇面向什么平臺打包

Output Path

AssetBundle打包后的輸出路徑

Clear Folders

指打包前是否將Output Path中的文件清空

Copy to StreamingAssets

將Output path中的文件復制到Unity StreamingAssets文件夾中

Compression

No Compression 不壓縮,解壓快,但是AssetBundle包大

LZMA 壓縮大小最小,但是解壓慢,如果需要AB包中一個資源,會將所有資源進行解壓

LZ4 壓縮大小會比LZMA大,但是用什么資源就解壓什么資源(推薦)

4、點擊Build按鈕,進行資源構建

每一個AssetBundle資源將會有一個和文件相關的“.mainfest”文件,該文件提供了所打包資源的CRC和資源依賴的信息。還有兩個文件(StandaloneWindows),記錄整個AssetBundle文件夾的信息,包括資源列表及各個列表之間的依賴關系。

自定義工具(使用AB包構建API)

輸出路徑一般情況下為Assets下的某一個文件夾,該文件夾不會自動創建,需要玩家在運行前手動創建,否則會報錯

[MenuItem("項目工具/AssetBundle/構建AB包資源")]
public static void BuildAssetBundleLogic()
{BuildPipeline.BuildAssetBundles("Assets/AssetBundles", BuildAssetBundleOptions.None,BuildTarget.StandaloneWindows);
}

加載AB包

AssetBundle不能夠重復加載,否則報錯

方法

描述

AssetBundle.LoadFromFile

從磁盤上的文件同步加載 AssetBundle。

AssetBundle.LoadAsset(string name)

從捆綁包中加載名為 name 的資源。

AssetBundle.LoadAsset<T>(string name)

AssetBundle.LoadAsset(string name,Type type)

AssetBundle.LoadAllAssets

加載AssetBundle中所有資源對象

AssetBundle.LoadAllAssetsAsync

異步加載AssetBundle中所有資源togn

為了便于測試,將打包后的AB包放到StreamingAssets文件夾中,實際開發時可以自己指定路徑。

同步加載

public Image icon;void Start()
{var abPath=Path.Combine(Application.streamingAssetsPath,"role.game");//先加載AB包var ab = AssetBundle.LoadFromFile(abPath);//從AB包中加載指定資源var sprite = ab.LoadAsset<Sprite>("迪希雅");icon.sprite = sprite;
}

異步加載

StartCoroutine(LoadABRes("role.game", "迪希雅", (obj) =>{if (obj is Sprite sprite){icon.sprite = sprite;}}));/// <summary>
/// 異步加載AB包中的資源
/// </summary>
/// <param name="abName">ab包名稱</param>
/// <param name="resName">資源名稱</param>
/// <param name="callback">成功加載后回調</param>
/// <returns></returns>
IEnumerator LoadABRes(string abName, string resName,Action<object> callback)
{//加載ab包var ab = AssetBundle.LoadFromFileAsync(Application.streamingAssetsPath + "/" + abName);yield return ab;//從ab包中加載資源var asset = ab.assetBundle.LoadAssetAsync(resName, typeof(Sprite));yield return asset;callback?.Invoke(asset.asset);
}

卸載AB包

方法

描述

Unload (bool unloadAllLoadedObjects);

有異步方法

卸載 AssetBundle 釋放其數據。

當 unloadAllLoadedObjects 為 false 時,只卸載ab包,不清除已加載的資源

當為 true 時,不僅卸載ab包,還會清除已加載的資源引用

AssetBundle.UnloadAllAssetBundles(bool unloadAllObjects)

無異步方法

卸載當前已加載的所有 AssetBundle。

unloadAllObjects的true/false規則同上

private void UnloadAssetBundle(string abName)
{var list = AssetBundle.GetAllLoadedAssetBundles().ToList();for (var i = 0; i < list.Count; i++){var ab = list[i];if (ab.name == abName){ab.Unload(true);break;}}
}

注意

資源依賴問題

這是 AB 系統中最復雜也最容易出問題的部分。

如果包 A 中的預制體使用了包 B 中的材質,那么包 A 就依賴于包 B。加載包 A 中的預制體前,必須確保包 B 中的材質已經被加載到內存中。

//加載依賴資源
private void LoadDependRes(string abName)
{//加載主包var abMain = AssetBundle.LoadFromFile($"{Application.streamingAssetsPath}/StandaloneWindows");//加載主包中的固定文件var abManifest = abMain.LoadAsset<AssetBundleManifest>("AssetBundleManifest"); //從固定文件中,得到依賴信息var strs = abManifest.GetAllDependencies(abName);//得到了依賴包的名字foreach (var item in strs){AssetBundle.LoadFromFile($"{Application.streamingAssetsPath}/{item}");}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/96222.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/96222.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/96222.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

golang-gin包

文章目錄一、了解gin二、html渲染三、gin中get/post獲取值四、路由分組五、中間件六、文件上傳七、gin中的cookie一、了解gin Gin 是一個用 Golang編寫的 高性能的web 框架, 由于http路由的優化&#xff0c;速度提高了近 40 倍。 Gin的特 點就是封裝優雅、API友好。 特性類別…

基于腳手架微服務的視頻點播系統-界面布局部分(二):用戶界面及系統管理界面布局

基于腳手架微服務的視頻點播系統-界面布局部分:二.首頁及播放界面布局一.用戶界面布局1.1用戶界面布局分析與實現1.2更新用戶圖像按鈕及邏輯1.3修改按鈕及邏輯1.4上傳視頻對話框實現邏輯1.4.1頁面跳轉邏輯處理1.4.2頁面控件響應處理二.系統界面布局2.1系統管理頁框架2.2審核管理…

STL庫——二叉搜索樹

? ? ? ? ? づ?ど &#x1f389; 歡迎點贊支持&#x1f389; 個人主頁&#xff1a;勵志不掉頭發的內向程序員&#xff1b; 專欄主頁&#xff1a;C語言&#xff1b; 文章目錄 前言 一、二叉搜索樹的概念 二、二叉搜索樹的性能分析 三、二叉搜索樹的插入 四、二叉搜索樹的查…

【Linux】線程概念與控制

一. 線程的概念1.什么是線程線程是進程內部的一個執行流&#xff0c;是進程調度的基本單位。它具有輕量的特點&#xff0c;它的創建和銷毀所消耗的資源更少&#xff0c;線程間切換比進程間切換消耗的資源更少&#xff1b;它與進程共享一張虛擬地址空間表&#xff0c;通過進程來…

雙軸傾角傳感器廠家與物聯網角度傳感器應用全解析

本文主要探討雙軸傾角傳感器廠家的核心技術優勢&#xff0c;以及物聯網角度傳感器在智能監測中的創新應用。同時&#xff0c;也詳細介紹了水平監測傳感器廠家的解決方案特點&#xff0c;并分析了專業進口傾角傳感器代理所提供的原廠品質保障與本地化服務支持。以深圳瑞慣科技有…

容器-資源隔離機制

一. 引言&#xff1a; 大家都知道&#xff0c;在一臺機器上&#xff0c;可以運行任意(根據系統資源)個容器實例。且各容器間是相互獨立&#xff0c;不做任何關聯的。那么&#xff0c;docker是通過什么方式來實現容器隔離的呢&#xff1f; 接下來我們了解下。 二. 關于容器隔離…

Agentic RL Survey: 從被動生成到自主決策

Agentic RL Survey: 從被動生成到自主決策 本文將系統解讀《The Landscape of Agentic Reinforcement Learning for LLMs: A Survey》這篇綜述。該綜述首次將智能體強化學習&#xff08;Agentic RL&#xff09;與傳統LLM-RL范式正式區分&#xff0c;通過MDP/POMDP理論框架梳理…

徹底禁用 CentOS 7.9 中 vi/vim 的滴滴聲

在 VMware 虛擬機中安裝的 CentOS 7.9 系統&#xff0c;即使通過修改 /etc/inputrc 禁用了終端鈴聲&#xff08;set bell-style none&#xff09;&#xff0c;vi 或 vim 編輯時仍可能發出滴滴聲。這是因為 vi/vim 有自己獨立的鈴聲控制機制。以下是解決方法&#xff1a;方法 1&…

基于A2A和ADK的內容規劃代理

項目概述 Content Planner Agent 是一個基于 Google Agent Development Kit (ADK) 和 Python A2A SDK 構建的智能內容規劃代理。該代理能夠根據高層次的內容描述&#xff0c;創建詳細的內容大綱。 什么是A2A Protocol A2A Protocol&#xff08;Agent2Agent 協議&#xff09;…

Linux-條件變量

文章目錄條件變量概述條件變量的優缺點條件變量相關函數pthread_cond_init函數pthread_cond_destroy函數pthread_cond_wait函數pthread_cond_signal函數測試生產者和消費者模型條件變量 概述 與互斥鎖不同&#xff0c;條件變量是用來等待而不是用來上鎖的&#xff0c;條件變量…

[硬件電路-166]:Multisim - SPICE與Verilog語言的區別

SPICE與Verilog語言在電子設計領域中扮演不同角色&#xff0c;SPICE是電路仿真語言&#xff0c;用于精確模擬電路行為&#xff1b;Verilog是硬件描述語言&#xff0c;用于描述數字電路的結構和行為。以下是兩者的詳細區別&#xff1a;一、核心定位與用途SPICE&#xff1a;電路仿…

玩轉Docker | 使用Docker部署Umbrel操作系統

玩轉Docker | 使用Docker部署Umbrel操作系統 前言 一、 Umbrel 介紹 Umbrel簡介 Umbrel主要特點 二、系統要求 環境要求 環境檢查 Docker版本檢查 檢查操作系統版本 三、部署Umbrel服務 下載Umbrel鏡像 編輯部署文件 創建容器 檢查容器狀態 檢查服務端口 安全設置 四、訪問Umbr…

Flink Task線程處理模型:Mailbox

Task的線程 和 MailboxProcessor 的綁定executingThread 是 Task 類&#xff08;StreamTask 的父類&#xff09;在構造時創建的物理線程。MailboxProcessor 是 StreamTask 用來處理異步事件和驅動其主要處理邏輯&#xff08;processInput&#xff09;的核心組件。它們之間的綁定…

OpenCV 銀行卡號識別

目錄 一、項目原理與核心技術 二、環境準備與工具包導入 1. 環境依賴 2. 工具包導入 三、自定義工具類 myutils.py 實現 四、主程序核心流程&#xff08;銀行卡識別.py&#xff09; 1. 命令行參數設置 2. 銀行卡類型映射 3. 輔助函數&#xff1a;圖像展示 五、步驟 1…

計算機二級Python

一.靜態語言和腳本語言高級語言根據計算機執行機制的不同分為兩類&#xff1a;靜態語言和腳本語言靜態語言的核心特征&#xff1a;變量的類型在編譯時&#xff08;寫代碼時&#xff09;就必須確定并固定下來&#xff0c;即在使用一個變量前必須顯式地聲明它地類型一旦聲明&…

Mybatis Log Plugin打印日志,會導致CPU升高卡死

原因 大量日志輸出:MyBatis Log Plugin 會打印大量的 SQL 日志,包括 SQL 語句及其參數。如果項目中 SQL 查詢頻繁且復雜,日志量會非常大,導致 CPU 使用率升高,甚至卡死。 日志級別設置不當:如果將日志級別設置為 DEBUG 或 TRACE,MyBatis 會輸出非常詳細的日志信息,這會…

鴻蒙:深色模式適配和淺色模式的切換

前言&#xff1a; 有些時候我們需要對應用進行深色模式的適配處理&#xff0c;并且在不需要的時候切換到淺色狀態&#xff0c;下面和大家一起照著官方文檔來學習。 下面是官方文檔的鏈接&#xff1a; https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-dark-…

Coze源碼分析-資源庫-刪除插件-后端源碼-數據訪問和基礎設施層

5. 數據訪問層 5.1 倉儲接口定義 插件倉儲接口 文件位置&#xff1a;backend/domain/plugin/repository/plugin.go type PluginRepository interface {// DeleteDraftPlugin 刪除插件草稿DeleteDraftPlugin(ctx context.Context, pluginID int64) error// DeleteAPPAllPlugins …

案例一: 對基礎選擇器的使用【網頁盒子】

【1】樣例&#xff1a;首先&#xff0c;觀察到&#xff0c;幾個元素豎著排列的&#xff0c;所以使用塊級元素&#xff0c;而不是行內元素。【2】代碼演示<head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width,…

爬蟲項目優化:如何用 Redis 實現 “斷點續爬”?避免重復采集電商數據

在電商數據采集場景中&#xff0c;爬蟲常因網絡波動、服務器重啟、IP 封禁等問題中斷。若缺乏斷點續爬機制&#xff0c;重啟后需從頭開始&#xff0c;不僅浪費帶寬與時間&#xff0c;還可能因重復采集導致數據冗余。Redis 憑借其高性能、原子操作、多樣數據結構的特性&#xff…