分享

Unity和Lua交互

 kiki的号 2017-02-14

用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),不然这两个路径的位置是不一样的!


 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多