cocos2dx_lua读取unity手机游戏本地文件
这个问题根据手机类型分两类分别来讨论:
1.android
要想读取unity本地文件,首先得知道他的位置。
a.获取文件位置的方法:
因为安卓有android模拟器,再根据一些unity文档我们知道unity对安卓存储本地的文件名叫做
[包名].v2.playerprefs.xml
我们使用了夜神模拟器
根据图示打开安卓文件夹
点击 根目录,在根据目录一层层找下去,最终在包名下的shared_prefs目录下可以看到我们最终要解析的文件。
找到了文件,接下来就是看看cocos中如何去解析。还有一个需要了解的情况就是unity中本地文件加密行为,一般会使用到unity中的一个加密插件Anti-Cheat Toolkit,当然本篇文章无法教大家如何破解这个插件,但是如果我们已知加密key的情况下,事情还是能继续下去的。
--首先在代码里找到这个文件local FU = cc.FileUtils:getInstance()local writablePath = FU:getWritablePath()local filePath = writablePath .. "../shared_prefs/[包名].v2.playerprefs.xml"--如果文件存在则继续往下走if FU:isFileExist(filePath) == true then --直接把加密key 和 加密key加密后的值 写出,通过 加密key加密后的值 在xml文件中搜索 value加密后的值,然后进行解码 local accoundByID = "加密key" --加密key local accoundByID_encodeKey = "加密key加密后的值" --加密key加密后的值 if device.platform == "android" then local ptrFile = FU:getStringFromFile(filePath) local xfile = xml.eval(ptrFile) for i = 1,#xfile do if type(xfile[i]) == 'table' and xfile[i][0] == "string" then local key = xfile[i].name local value = xfile[i][1] --value加密后的值 if key == accoundByID_encodeKey then --解密 local accountStr = decode_Unity_GetString(accoundByID, value) --TODO break end end end endend
这里还有一个解密的过程,看了一下c#的写法,在lua这边重新写一下,这里面有一些urlencode、urldecode还有base64的操作各个工程不同。如果能正确的完成这个过程会得到解码后的字符串。
这里面有一个lua和c++交互的坑。base64解码是调用的c++函数,但是解码后的字符串里可能会有‘\0’而这个字符在字符串传递的过程中可能会被截断!所以可以在base64解码后urlencode一下,到lua里decode就可以了。
function decode_Unity_GetString(key, value) local urldecode_value = string.urldecode(value) local inputBytes = string.urldecode(Base64(urldecode_value)) local bytab = {} local inputBytes_len = string.len(inputBytes) for i = 1, inputBytes_len do local s = string.sub(inputBytes, i, i) table.insert(bytab, string.byte(s)) end local encryptedBytes = {} local encryptedBytes_len = inputBytes_len - 7--在unity里有一套检测算法,这里直接走正确分支了 for i = 1, encryptedBytes_len do encryptedBytes[i] = bytab[i] end local cryptoKey = key .. "e806f6" local encryptionKeyLength = string.len(cryptoKey) local cleanBytes = "" for i = 1, encryptedBytes_len do local cryptoKey_i = (i - 1) % encryptionKeyLength + 1 --c#中从0开始模,lua减1后再模,并加上1作为下标位置 local cryptoKey_num = string.byte(string.sub(cryptoKey, cryptoKey_i, cryptoKey_i)) encryptedBytes[i] = Sha256.bxor(encryptedBytes[i], cryptoKey_num) cleanBytes = cleanBytes .. string.char(encryptedBytes[i]) end return cleanBytesend
2.Ios
ios和安卓还是有一些不同的,为了得到ios应用中的本地文件,可以使用xcode工具。
设备链接上电脑,点击windows -> Devices
选中具体的项目,点击设置 -> 下载包内容。
打开包内容就能看到
在ios中是一个【包名】.plist 文件。那么在cocos中应该如何读取plist文件呢?
其实cocos已经提供了一个方法了,只不过可惜的是没有写lua绑定,不过没关系,自己写一个就是了,还是很简单的。
读到了本地的plist文件,后续的步骤就和android一样,只需要把取到的加密串解密就行了。