用lua就表示項(xiàng)目用到了熱更新,通常每次熱更新都會(huì)從服務(wù)器獲取最新的lua腳本放到Android/ios設(shè)備的本地目錄下,但是lua應(yīng)該放到哪個(gè)目錄下呢,這里就先說說lua里面的路徑問題
1、不可以放到Resources文件夾下,因?yàn)闊o法找到其在設(shè)備下的位置,Resources下的東西是由unity來管理的,使用的時(shí)候通過Resources.load/loadAll來加載,而且后綴為lua的文件,無法通過Resources來加載
2、不可以放到StreamingAssets文件夾,因?yàn)樵谠O(shè)備下StreamingAssets文件夾里面的資源只能讀,不能寫,當(dāng)我們熱更新最新的資源的時(shí)候,是不好操作的!而且StreamingAssets文件夾下的東西最終在生成apk的時(shí)候會(huì)被unity打包進(jìn)一個(gè)叫pkg.apk的apk安裝包里,解壓這個(gè)pkg.apk可以看到StreamingAssets文件夾下的資源,pkg.apk是存在于應(yīng)用的安裝目錄下的,是應(yīng)用的資源文件,unity中設(shè)置應(yīng)用的安裝目錄是由設(shè)置PlayerSettings下的Install Location來設(shè)置的,Install Location設(shè)置為Perfer External(優(yōu)先安裝到外部設(shè)備,也就是sdcard),安裝此包,用文件查看器查看才能看到此應(yīng)用的安裝目錄(通常在/mnt/asec目錄下),但是沒有sdcard的手機(jī)貌似即使選項(xiàng)設(shè)置為了Perfer External也是看不到此應(yīng)用的相關(guān)安裝目錄的,通常如下:
com.zwh.p1是我的包名,安裝目錄的名稱通常是(應(yīng)用的包名-數(shù)字),此安裝目錄默認(rèn)是不能刪除的,如果通過第三方軟件強(qiáng)制刪除,那么相對應(yīng)的應(yīng)用就會(huì)再也用不起來了(應(yīng)用的數(shù)據(jù)文件被破壞),
如果程序就是安裝到外部,那么都是能看到他的安裝目錄的,其他應(yīng)用也是如此:
如果Install Location設(shè)置為Force Internal(強(qiáng)制安裝到手機(jī)內(nèi)存),那么是看不到程序的安裝文件的!
如何訪問StreamingAssets文件下的資源:
string GetStreamingAssetsPath() { return #if UNITY_ANDROID //"jar:file://" + Application.dataPath + "!/assets/"; UnityEngine.Application.streamingAssetsPath+"/"; #elif UNITY_IPHONE Application.dataPath + "/Raw/"; #elif UNITY_STANDALONE_WIN || UNITY_EDITOR "file://" + Application.dataPath + "/StreamingAssets/"; #else string.Empty; #endif }
WWW www=new WWW("file://c:/a1.lua");//使用上面的方式加載c盤的lua文件時(shí),是加載不出來的WWW www=new WWW("file:///c:/a1.lua");//加個(gè)斜桿/ 即可!
當(dāng)我把一個(gè)lua文件放到unity下StreamingAssets文件夾里,然后通過如上代碼去訪問這個(gè)lua文件,打印訪問的路徑如下:
路徑 = jar:file:///mnt/asec/com.zwh.p1-1/pkg.apk!/assets/mi.lua
由此可見,StreamingAssets文件夾下的資源被打包進(jìn)了pkg.apk這個(gè)安裝包里去了!
3、先看看unity中幾個(gè)路徑有關(guān)的類,在android平臺(tái)輸出的路徑為什么
Debug.Log ("temporaryCachePath = " + UnityEngine.Application.temporaryCachePath); //temporaryCachePath = /storage/sdcard0/Android/data/com.zwh.p1/cacheDebug.Log ("dataPath = " + UnityEngine.Application.dataPath); //dataPath = /mnt/asec/com.zwh.p1-2/pkg.apkDebug.Log ("persistentDataPath = " + UnityEngine.Application.persistentDataPath); //persistentDataPath = /storage/sdcard0/Android/data/com.zwh.p1/filesDebug.Log ("streamingAssetsPath = " + UnityEngine.Application.streamingAssetsPath); //streamingAssetsPath = jar:file:///mnt/asec/com.zwh.p1-2/pkg.apk!/assets
可以看出dataPath和streamingAssetsPath指的是程序安裝的位置,而temporaryCachePath和persistentDataPath指的則是sdcard的位置,所以可以選擇這兩個(gè)路徑作為存放lua文件的地方,
前提是unity出包的時(shí)候,要設(shè)置Playersettings下Write Access為External(SDCard),不然這兩個(gè)路徑的位置是不一樣的!