用lua就表示项目用到了热更新,通常每次热更新都会从服务器获取最新的lua脚本放到Android/ios设备的本地目录下,但是lua应该放到哪个目录下呢,这里就先说说lua里面的路径问题 1、不可以放到Resources文件夹下,因为无法找到其在设备下的位置,Resources下的东西是由unity来管理的,使用的时候通过Resources.load/loadAll来加载,而且后缀为lua的文件,无法通过Resources来加载 2、不可以放到StreamingAssets文件夹,因为在设备下StreamingAssets文件夹里面的资源只能读,不能写,当我们热更新最新的资源的时候,是不好操作的!而且StreamingAssets文件夹下的东西最终在生成apk的时候会被unity打包进一个叫pkg.apk的apk安装包里,解压这个pkg.apk可以看到StreamingAssets文件夹下的资源,pkg.apk是存在于应用的安装目录下的,是应用的资源文件,unity中设置应用的安装目录是由设置PlayerSettings下的Install Location来设置的,Install Location设置为Perfer External(优先安装到外部设备,也就是sdcard),安装此包,用文件查看器查看才能看到此应用的安装目录(通常在/mnt/asec目录下),但是没有sdcard的手机貌似即使选项设置为了Perfer External也是看不到此应用的相关安装目录的,通常如下: com.zwh.p1是我的包名,安装目录的名称通常是(应用的包名-数字),此安装目录默认是不能删除的,如果通过第三方软件强制删除,那么相对应的应用就会再也用不起来了(应用的数据文件被破坏), 如果程序就是安装到外部,那么都是能看到他的安装目录的,其他应用也是如此: 如果Install Location设置为Force Internal(强制安装到手机内存),那么是看不到程序的安装文件的! 如何访问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文件时,是加载不出来的 WWW www=new WWW("file:///c:/a1.lua"); //加个斜杆/ 即可! 当我把一个lua文件放到unity下StreamingAssets文件夹里,然后通过如上代码去访问这个lua文件,打印访问的路径如下: 路径 = jar:file:///mnt/asec/com.zwh.p1-1/pkg.apk!/assets/mi.lua 由此可见,StreamingAssets文件夹下的资源被打包进了pkg.apk这个安装包里去了! 3、先看看unity中几个路径有关的类,在android平台输出的路径为什么 Debug.Log ("temporaryCachePath = " + UnityEngine.Application.temporaryCachePath); //temporaryCachePath = /storage/sdcard0/Android/data/com.zwh.p1/cache Debug.Log ("dataPath = " + UnityEngine.Application.dataPath); //dataPath = /mnt/asec/com.zwh.p1-2/pkg.apk Debug.Log ("persistentDataPath = " + UnityEngine.Application.persistentDataPath); //persistentDataPath = /storage/sdcard0/Android/data/com.zwh.p1/files Debug.Log ("streamingAssetsPath = " + UnityEngine.Application.streamingAssetsPath); //streamingAssetsPath = jar:file:///mnt/asec/com.zwh.p1-2/pkg.apk!/assets 可以看出dataPath和streamingAssetsPath指的是程序安装的位置,而temporaryCachePath和persistentDataPath指的则是sdcard的位置,所以可以选择这两个路径作为存放lua文件的地方, 前提是unity出包的时候,要设置Playersettings下Write Access为External(SDCard),不然这两个路径的位置是不一样的!
|
|