Unity讀取內部、外部資源詳解
unity讀取資源大概分為兩部分:一部分為內部資源,什麼是內部資源,就是匯入unity中的資源,我們稱之為Asset,這部分資源unity有現成的管理方法。另外一部分是外部資源,沒有匯入unity,也不是打包的AssetBundle資源,比方說就是一個txt、png、lua等資源,需要自己去實現讀取以及資源的管理。下面具體介紹: 內部資源
先說下個平台路徑問題:
IOS平台
Application.dataPath : Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data 可讀 Application.streamingAssetsPath : Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data/Raw 可讀 Application.persistentDataPath : Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Documents 可讀可寫 Application.temporaryCachePath : Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Library/Caches 可讀可寫
dataPath是app程式包安裝路徑,app本身就在這裡,此目錄是唯讀。streamingAssetsPath是dataPath下的Raw目錄。
app的獨立資料存放區目錄下有三個檔案夾:Documents,Library和tmp。
Documents目錄,儲存需要長期儲存的資料,如熱更新內容,iCloud會自動備份此目錄。
Library目錄,這個目錄下有兩個子目錄,Caches和Preferences。
Caches是一個相對臨時的目錄,適合存放下載快取的臨時檔案,空間不足時可能會被系統清除,Application.temporaryCachePath返回的就是此路徑。我把熱更新 的臨時檔案寫在這裡,等一個版本的所有內容更新完全後,再把內容轉移到Documents目錄。
Preferences用於應用儲存喜好設定,用NSUserDefaults讀取或設定。
tmp目錄,臨時目錄,存放應用運行時臨時使用的資料。
Android
Application.dataPath : /data/app/xxx.xxx.xxx.apkApplication.streamingAssetsPath : jar:file:///data/app/xxx.xxx.xxx.apk/!/assetsApplication.persistentDataPath : /data/data/xxx.xxx.xxx/filesApplication.temporaryCachePath : /data/data/xxx.xxx.xxx/cache
Android這幾個路徑讀取許可權和IOS一樣,需要注意的就是Application.streamingAssetsPath目錄是jar包協議,在unity中需要用www去負載檔案,其他的路徑可以直接用檔案流去讀取。
Editor
這個就不說了。。。通用的。。。
關於資源的釋放問題,已經有小夥伴詳細的解答了,就不囉嗦了,點傳送門。
傳送門 外部資源
再來說說外部資源,外部資源需要遵循ftp 、jar、http、https等協議,具體的拼接需要注意多一個或者少一個“/”的問題,然後用www去載入就行。讀取外部資源大部分用到pc上,android、ios等還是扔到persistentDataPath 路徑裡。具體例子如下:
public Texture2D LoadTexture2D(string path){ string dataPath = "file:///" + path; WWW www = new WWW(dataPath); while (!www.isDone) //同步等待,當然你可以採用協程,自己決定就好 { } if (www.error != null) return null; Texture2D texture = new Texture2D(4, 4, TextureFormat.ARGB32, false); //初始大小隨便設定,只要大於1就好,false是不開啟mipamaps texture.LoadImage(www.bytes); //你可以設定一些Texture相關屬性,www載入的texture2d是預設的屬性 texture.wrapMode = TextureWrapMode.Clamp; www.Dispose(); //中斷連線,如果不斷開的話,下次就會提示還在佔用串連 return texture;}需要注意的就是釋放資源,直接用GameObject.DestroyImmediate(texture)或者GameObject.Destroy(texture),這樣才能卸載掉記憶體,外部資源不是一個Asset,unity不會去幫你管理的,這時需要注意記憶體流失問題。
資源釋放傳送門
個人實踐,如有錯誤歡迎留言交流。