> 文档中心 > cocos2dx_lua读取unity手机游戏本地文件

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一样,只需要把取到的加密串解密就行了。