本篇文章旨在整理Unity中常見的加載方式,介紹其使用方式舔痪、適用的場景,相似的加載方式會進(jìn)行對比遇伞,加強(qiáng)理解和記憶辙喂,也可以作為日后的查閱資料。文章將可加載的資源分為兩個大類鸠珠,外部資源和內(nèi)部資源巍耗,內(nèi)部資源就是Unity發(fā)布時默認(rèn)打進(jìn)包里的資源,不能直接獲取到了渐排,如Resource文件夾里的炬太,外部資源則相反。
1.外部資源的加載
1.1 二進(jìn)制字節(jié)流加載
流式加載方式對于文件類型沒有要求驯耻,可以加載圖片如jpg亲族、png等,音頻如mp3等可缚,視頻如mp4等各種格式霎迫,下面以圖片和視頻的加載為例來介紹流式加載。
指定路徑的單張圖片
首先要在腳本中引用System.IO
命名空間帘靡,并定義GetImageByte方法獲取文件字節(jié)流(該方法不僅限于獲取圖片)知给,參數(shù)path為圖片的路徑(帶后綴),unity中一般以Application.dataPath
加上圖片在Assets文件下的相對路徑拼接而成,比如下圖中我從項目截取的目標(biāo)圖片01涩赢,其路徑為Application.dataPath + "/Textures/PuzzleGame/InitImages/01.png"
戈次。
方法的實現(xiàn)如下:
static byte[] GetImageByte(string path)
{
FileStream files = new FileStream(path, FileMode.Open);
byte[] imageByte = new byte[files.Length];
files.Read(imageByte, 0, imageByte.Length);
files.Close();
return imageByte;
}
在以上基礎(chǔ)上蘑志,定義圖片加載方法均芽,主要使用的就是Texture2D類下的LoadImage方法,將圖片的字節(jié)流轉(zhuǎn)化為Texture2D格式的圖片丙者,方法實現(xiàn)如下:
static public Texture2D LoadOneImage(string path)
{
Texture2D t2d = new Texture2D(1, 1);
t2d.LoadImage(GetImageByte(path));
return t2d;
}
初始化Texture2D對象時花墩,構(gòu)造函數(shù)中長寬初始值可以任意指定悬秉,比如我指定為(1,1)观游,LoadImage方法會根據(jù)原圖大小覆蓋掉初始值搂捧。
指定文件夾下的全部圖片
獲取文件夾下所有格式的圖片,思路就是選定需要獲取的圖片格式懂缕,通過Dictionary.GetFiles
方法拿到這些格式圖片的全部路徑,并添加到路徑到List鏈表中王凑,然后對鏈表中每一個路徑使用LoadOneImage方法搪柑,方法實現(xiàn)如下:
static public List<Texture2D> LoadAllImage(string path)
{
List<string> imagePaths = new List<string>();
List<Texture2D> images = new List<Texture2D>();
string allType = "*.png|*.jpg|*.gif|*.bmp"; //圖片格式
string[] imageTypes = allType.Split('|');
for (int i = 0; i < imageTypes.Length; i++)
{
string[] thisTypeImagePaths = Directory.GetFiles(path, imageTypes[i]);
for (int j = 0; j < thisTypeImagePaths.Length; j++)
{
imagePaths.Add(thisTypeImagePaths[j]);
}
}
foreach (var imagePath in imagePaths)
{
images.Add(LoadOneImage(imagePath));
}
return images;
}
這兒指定了四種格式,可以根據(jù)需求自行修改索烹。
1.2 UnityWebRequest方式
UnityWebRequest類是unity5.x之后用來取代WWW工碾,滿足今天http通信需求的新api類
using (UnityWebRequest www = UnityWebRequest.Post(url, new WWWForm()))
1.3 WWW方式
www方式支持http和file兩種協(xié)議,因此可以加載網(wǎng)絡(luò)上以及本地的圖片百姓,文本渊额,音頻等資源,www方式需要在協(xié)程中實現(xiàn)垒拢,需使用StartCoroutine
調(diào)用其所在方法旬迹,網(wǎng)絡(luò)資源的路徑就為其url,本地資源使用“file://”加上絕對路徑作為參數(shù)求类,比如D盤下Image文件夾下的圖片01.png奔垦,其對應(yīng)的path參數(shù)就是“file://D:\Image\01.png”
,方法實現(xiàn)如下:
public static IEnumerator LoadImagebyWWW(string path)
{
WWW www = new WWW(path);
yield return www;
if (www != null && string.IsNullOrEmpty(www.error))
{
Texture2D t2d = www.texture;
}
}
WWW方式的加載速度比較慢尸疆,屬于舊版本方法椿猎,現(xiàn)在官方推薦使用UnityWebRequest
2.內(nèi)部資源的加載
2.1Resources方式加載
使用resources.load
方式需要將資源文件放到Resources文件夾下,這是unity的規(guī)定寿弱,該文件夾下的所有內(nèi)容在發(fā)布時都會被打包到安裝包里犯眠,如果你使用了Resources文件來管理資源,你所發(fā)布的應(yīng)用程序文件的Data目錄下症革,會有一個resources.assets文件筐咧,這就是Resources文件夾編譯后生成的。
正因為如此地沮,Resources管理的資源對分包發(fā)布和版本更新是不友好的嗜浮,如果確定該資源在項目的整個生命周期中都不會有變動羡亩,則可以考慮放入Resources文件夾,否則使用bundle來管理資源會更靈活危融。
Resources.load()
畏铆、Resources.loadAll()
的路徑參數(shù)為資源在Resources文件夾下的相對路徑。