?????個人主頁:@元宇宙-秩沅
????? hallo 歡迎 點贊?? 收藏? 留言?? 加關(guān)注?!
????? 本文由 秩沅 原創(chuàng)
????? 收錄于專欄:unity每日一記
????推薦文章?
?【軟件設(shè)計師高頻考點暴擊】
?【Unityc#專題篇】之c#系統(tǒng)化大禮包】
?【unity數(shù)據(jù)持久化】數(shù)據(jù)管理類_PlayerPrfs
?【unity本站最全系列】unity常用API大全一篇文章足以
??
??Resources資源動態(tài)加載
同步加載
5種資源加載的方式,Resource加載介紹
- Resources(只能加載Resources目錄中的資源)
- AssetBundle(只能加載AB資源,當前設(shè)備允許訪問的路徑都可以)
- WWW(可以加載任意處資源,包括項目外資源(如遠程服務(wù)器))
- AssetDatabase(只能加載Assets目錄下的資源,但只能用于Editor)
- UnityWebRequest(可以加載任意處資源,是WWW的升級版本)
資源加載適用于需要加載資源較多的 情況就不用一個一個的拖拽進去
關(guān)鍵字:@ ,as
卸載AB包的方法: Resource. UnLoadAsset
void Start()
{
Object obj= Resources.Load("sound");
//AudioClip ac = obj as AudioClip;
AudioClip ac = (AudioClip)obj;
AudioSource.PlayClipAtPoint(ac, transform.position);
//Resources.LoadAll<AudioClip>("Prefabs");
AudioClip[] audioClips= Resources.LoadAll<AudioClip>("");
foreach (var item in audioClips)
{
Debug.Log(item);
}
//Resources.UnloadAsset
}
-
C#中的回收機制是系統(tǒng)自動回收的,有多種回收機制,不像其他語言需要手動回收
注意:
//預(yù)設(shè)體對象加載需要實例化
//其它資源加載一般直接用
#endregion
Resource資源加載操作
加載資源前首先需要在project面板中創(chuàng)建Resource名字的文件夾,為固定文件夾用于資源加載
以加載AudioClip類型的資源為例:
- 根目錄加載 Resource.Load< AudioClip>(“voice”);
- 子目錄加載 Resource.Load ( @ " 子目錄名/ voice") ;
- 另一種形式:
Object xx = Resource.Load(“voice”);
AudioClip yy as xx ; // 顯性類型轉(zhuǎn)換 ,前提是二者兼容 - 加載同類型所有資源的方法:
①根目錄加載: AudioClip [] xx = Resource.AllLoad(" “) ;
②子目錄加載:AudioClip [] yy = Resource.AllLoad(” 子目錄名");
- 1.預(yù)設(shè)體對象
Object obj = Resources.Load("Cube");
Instantiate(obj);
- 2.音效資源
Object obj3 = Resources.Load("Music/BKMusic");
//我們不需要實例化 音效切片 我們只需要把數(shù)據(jù) 賦值到正確的腳本上即可
audioS.clip = obj3 as AudioClip;
audioS.Play();
- 3.文本資源
文本資源支持的格式——.txt .xml .bytes .json .html .csv …
TextAsset ta = Resources.Load("Txt/Test") as TextAsset;
//文本內(nèi)容
ta.text
//字節(jié)數(shù)據(jù)組
ta.bytes);
- 4.圖片
tex = Resources.Load("Tex/TestJPG") as Texture;
異步加載
如果我們加載過大的資源可能會造成程序卡頓
異步加載 就是內(nèi)部新開一個線程進行資源加載 不會造成主線程卡頓
- Resources.LoadAsync(“XXX”);
- 注意:
異步加載 不能馬上得到加載的資源 至少要等待一幀
直接異步加載——適用于加載單個資源
//通過事件監(jiān)聽
ResourceRequest rq = Resources.LoadAsync<Texture>("Tex/TestJPG")
rq.completed += LoadOver;
//completed 是 ResourceRequest 中的委托
// AsyncOperation 是 ResourceRequest 的父類
private void LoadOver( AsyncOperation rq)
{
//在事件中添加結(jié)束標識邏輯,這樣我們就知道異步加載完成了
print("加載結(jié)束");
//加載完成后 會保存在 ResourceRequest類中的 asset Object類型成員里
//此時實現(xiàn)賦值
picture = (rq as ResourceRequest).asset as Texture;
}
配套協(xié)程異步加載——適用于加載多個資源
//通過協(xié)程的調(diào)度器自己判斷是否加載結(jié)束
StartCoroutine(Load());
IEnumerator Load()
{
ResourceRequest rq = Resources.LoadAsync<Texture>("Tex/TestJPG");
yield return rq;
// yield return rq會自己判斷 該資源是否加載完畢了,加載完畢過后才繼續(xù)執(zhí)行后面的代碼 ,因為ResourceRequest 也是YieldInstruction的子類
//-------------------------------
//isDone 和 progress API的應(yīng)用
while(!rq.isDone)
{
//打印當前的 加載進度
print(rq.progress);
yield return null;
}
//--------------------------------
picture = rq.asset as Texture;
}
資源加載器
利用異步直接加載和委托的使用構(gòu)成簡單的資源加載器
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
//-------------------------------------
//—————————————————————————————————————
//___________項目: ______________
//___________功能: 簡單的資源管理器
//___________創(chuàng)建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class ResourcesControl
{
static private ResourcesControl control;
static public ResourcesControl Control => control;
private ResourcesControl()
{
}
public void AddResources<T>(string name ,UnityAction<T> source ) where T : Object
{
ResourceRequest yb = Resources.LoadAsync<T>(name);
yb.completed += (reO) =>
{
source( (reO as ResourceRequest).asset as T );
};
}
}
//外部調(diào)用
private void Start()
{
GameObject shootball;
ResourcesControl.Control.AddResources<GameObject>("Profabs/ball",(sphere)=> {
shootball = sphere;
} );
}
卸載資源
-
Resources多次重復(fù)加載不會浪費內(nèi)存
但是 會浪費性能(每次加載都會去查找取出,始終伴隨一些性能消耗) -
1.卸載指定資源
Resources.UnloadAsset 方法
注意:它只能用于一些 不需要實例化的內(nèi)容 比如 圖片 和 音效 文本等 一般情況下很少單獨使用它
-
2.卸載未使用的資源
一般在過場景時和GC一起使用
Resources.UnloadUnusedAssets();
GC.Collect();
????系統(tǒng)路線學習點擊跳轉(zhuǎn)?
?【Unityc#專題篇】之c#進階篇】
?【Unityc#專題篇】之c#核心篇】
?【Unityc#專題篇】之c#基礎(chǔ)篇】
?【Unity-c#專題篇】之c#入門篇】
?【Unityc#專題篇】—進階章題單實踐練習
?【Unityc#專題篇】—基礎(chǔ)章題單實踐練習
?【Unityc#專題篇】—核心章題單實踐練習
你們的點贊?? 收藏? 留言?? 關(guān)注?是我持續(xù)創(chuàng)作,輸出優(yōu)質(zhì)內(nèi)容的最大動力!、文章來源:http://www.zghlxwxcb.cn/news/detail-657330.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-657330.html
到了這里,關(guān)于【Unity每日一記】資源加載相關(guān)你掌握多少?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!