unity3d 各个目录的意思
1.首先,你得理解Unity中各個(gè)目錄的意思?
我這里說的是移動(dòng)平臺(tái)(安卓舉例),讀,寫。所謂讀,就是你出大版本的包之后,這個(gè)只讀的話,就一輩子就這些東西了,不會(huì)改變了,不會(huì)有其他資源來覆蓋或者增加啦。
可寫,就是可以加?xùn)|西進(jìn)去唄。可能是自己太笨,一開始沒怎么注意這意思。竟然往StreamingAssets去實(shí)現(xiàn)資源更新(天啦擼)。
?
Application.StreamingAssetsPath,
StreamingAssets目錄必須在Assets根目錄下,該目錄下所有資源也會(huì)被打包到游戲里,不同于Resources目錄,該目錄下的資源不會(huì)進(jìn)行壓縮,同樣是只讀不可寫的。
這里的只可讀,不可寫,就是除了出大版本的包(重新下載),這里面的東西永遠(yuǎn)不會(huì)變。
各平臺(tái)StreamingAssets路徑打印:?
Win:E:/myProj/Assets/StreamingAssets?
Mac : /myProj/Assets/StreamingAssets?
Andorid:jar:file:///data/app/com.myCompany.myProj-1/base.apk!/assets?
iOS: /var/containers/Application/E5543D66-83F3-476D-8A8F-49D5332B3763/myProj.app/Data/Raw
Application.PersistentDataPath
?應(yīng)用程序安裝后才會(huì)出現(xiàn)。該目錄獨(dú)特之處在于是可讀,可寫的,所以我們一般將下載的AssetBundle存放于此。
各平臺(tái)PersistentDataPath路徑打印:?
Win:C:/Users/lodypig/Appdata/LocalLow/myCompany/myProj?
Mac : /Users/lodypig/Library/Application Support/myCompany/myProj?
Andorid:/data/data/com.myCompany.myProj/files?
iOS: /var/mobile/Containers/Data/Appliction/A112252D-6B0E-459Z-9D49-CD3EAC6D47D/Documents
Application.DataPath
應(yīng)用程序目錄,即Assets目錄。使用Appliction.dataPath訪問。只讀不可寫。
各平臺(tái)DataPath路徑:?
Win:E:/myProj/Assets?
Mac : /myProj/Assets/?
Andorid:/data/app/com.myCompany.myProj-1/base.apk!?
iOS: /var/containers/Application/E5543D66-83F3-476D-8A8F-49D5332B3763/myProj.app/Data
綜上,也就是說,要實(shí)現(xiàn)資源更新,你只有把資源下載到Application.PersistentDataPath目錄下才可實(shí)現(xiàn)資源更新(增加或者替換),其他目錄不可能實(shí)現(xiàn)。
?
2.理解上面三種目錄的關(guān)系,Unity游戲加載的資源是如何分配的?(彼此的關(guān)系)
首先你得有一個(gè)資源服務(wù)器(FTP為例),因?yàn)镾treamingAssets目錄是只讀的,我們想要實(shí)現(xiàn)熱更新,StreamingAssets
目錄里面的東西一旦第一個(gè)版本打出APK的包之后,這里的東西將永遠(yuǎn)不會(huì)變(只讀)。由于PersistentDataPath目錄是可讀可寫的,
所以游戲下載資源都會(huì)下載到這里面。這樣就實(shí)現(xiàn)了資源的熱更新。
?
注解:綠色的代表流動(dòng),可以不斷可以改變的資源。紅色線代表,讀取persistent目錄沒有的情況下,讀StreamingAssets目錄,所以,是永遠(yuǎn)不變的資源。(除非你去重新下載一個(gè)apk的包,就不是熱更了)
3.如何加載本地的資源?
?首先優(yōu)先判斷PersistentDataPath目錄下的資源是否存在,因?yàn)榉?wù)器上的資源都是下載到這里的,最新的資源通過下載到這里并且覆蓋,這里的資源
能保持跟服務(wù)器一致。(雨松之前講的UnityAssetBundle例子就是通過加載服務(wù)器上的,那個(gè)只是一個(gè)小案例,不能每次用哪下載到哪,每次都要下載,
這種方式是很不好用的,就第一次用的時(shí)候如果資源與服務(wù)器不一致,就下載到本地中,即PersistentDataPath目錄。)
因?yàn)槊總€(gè)游戲一開始出大版本的時(shí)候,都會(huì)附帶大量資源,就是放在StreamingAssets目錄,所以,這里存放大量資源。這樣減少下載的次數(shù)。
其實(shí),換一種說法,PersistentDataPath完全是給StreamingAssets的補(bǔ)丁目錄,我是這樣理解的。當(dāng)然,在項(xiàng)目運(yùn)用中,都需要優(yōu)先最先資源判斷。
?4.遇到的那些神神神.....坑?
???(1) 不要以為在PC端可以加載的路徑,安卓也可以用。
我這邊因?yàn)樯婕暗絎WW加載,貼出我的。
這里主要是通過www 如何加載PersistentDataPath和StreamingAssets這兩個(gè)目錄。
Application.PersistentDataPath:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | /// <summary> ???/// 天吶,一個(gè)Per目錄,還兩種方法加載。這真的是最后我找出來最完美的,可以加載的,之前還有N種版本,就不提了,網(wǎng)上有,我是經(jīng)過實(shí)測,Unity5.3.4版本 ???/// 加載PC上安卓平臺(tái),加載PC上Standalone,加載安卓真機(jī)(APK包),這三個(gè),都是可以加載的(WWW加載), ???/// </summary> ???public?static?string?PERSISTENT_PATH_DATABASE?//= LGameConfig.LOCAL_URL_PREFIX + Application.persistentDataPath + "/DataBase/"; ???{ ???????get ???????{ ???????????#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN ???????????????????return???"file:///"+ Application.persistentDataPath +?"/Test/"; ???????????#else ?????????????????????????return???"file://"+ Application.persistentDataPath +?"/Test/"; ???????????#endif ???????} ???} |
Application.StreamingAssets:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public?static?string?STREAMING_PATH_DATABASE ????{ ????????//這樣寫,因?yàn)榘沧縐nity平臺(tái)是Application.isMobilePlatform==false, 而宏定義中又? ==UNITY_ANDROID。 ?????????//因?yàn)槲覀冺?xiàng)目中是需要同時(shí)在PC下安卓平臺(tái)和PC下 Standard平臺(tái),哈哈 ????????get ????????{ ????????????if?(!Application.isMobilePlatform) ????????????{ ????????????????return?"file://"?+ Application.dataPath +?"/StreamingAssets"?+?"/DataBase/"; ????????????} ????????????else ????????????{ ????????????????return #if UNITY_ANDROID ????????Application.streamingAssetsPath+??"/DataBase/"; #else ??????"file://"?+ Application.dataPath +?"/StreamingAssets"?+?"/DataBase/"; #endif ????????????} ????????} |
這個(gè)加載地址,真的是精華,可能自己太笨,就是搞這個(gè)WWW加載安卓StreamingAssets目錄,花了大把時(shí)間,因?yàn)榫W(wǎng)上,加載方式真的是尼瑪一萬種,要噴一下,這些人,不實(shí)際打到APK測一下,我MDGB呀,坑的我好慘。
?
(2)不要以為在PC端可以用的方法,在安卓也可以用。
安卓上跟其他平臺(tái)不一樣,安裝后,這些文件實(shí)際上是在一個(gè)Jar壓縮包里,所以不能直接用讀取文件的函數(shù)去讀,而要用WWW方式
讀取的代碼(假設(shè)名為"文件.txt")?
(3) 安卓資源路徑加載,下載問題,真的是這次做AssetBundle最大的障礙。
(4)通過FTP和CDN下載資源的時(shí)候?qū)?yīng)的 后綴是不同的。
? FTP下載 后面用 ? "/" ?,即可。
? CDN下載 后面用 ?"//" ,即可。
(5)不同的加載方式,加載的路徑也是不同的。
具體我就不說了。
(6)記得加 加載文件的后綴名
安卓上跟其他平臺(tái)不一樣,安裝后,這些文件實(shí)際上是在一個(gè)Jar壓縮包里,所以不能直接用讀取文件的函數(shù)去讀,而要用WWW方式
1.讀取的代碼(假設(shè)名為"文件.txt")?
(7)加載方式,First In PersistentDataPath,Then StreamingAssets
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | IEnumerator LoadAnouncementText() ????{ ????????string?strUrl = GetTxtPerststentUrl(anouncementText); ????????WWW www =?new?WWW(strUrl); ????????yield?return?www; ????????if?(www.error ==?null) ????????{ ????????????mAnoucementText = ConvertByteToString(www.bytes); ????????} ????????else?if?(www.isDone) ????????{ ????????????string?strPerUrl = GetTxtStreamUrl(anouncementText); ????????????www =?new?WWW(strPerUrl); ????????????yield?return?www; ????????????if?(www.error ==?null) ????????????{ ????????????????mAnoucementText = ConvertByteToString(www.bytes); ????????????} ????????????else?if?(www.isDone) ????????????{ ????????????????Debug.LogError("下載當(dāng)前表出錯(cuò)"??+ www.error.ToString()); ????????????} ????????} ????} string?GetTxtStreamUrl(string?name) ????{ ????????return?STREAMING_PATH_DATABASE + name +?".txt"; ????} ????string?GetTxtPerststentUrl(string?name) ????{ ????????return?PERSISTENT_PATH_DATABASE + name +?".txt"; ????}!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!補(bǔ)充!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!補(bǔ)充:對于上面的路徑問題大家可能有些困惑。貼出最詳細(xì)全面的路徑問題,經(jīng)過測試,完全沒問題(安卓,PC都可以用,實(shí)際項(xiàng)目中使用) |
?
總結(jié)
以上是生活随笔為你收集整理的unity3d 各个目录的意思的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity3d之AssetBundle打
- 下一篇: 游戏通讯方式