为什么修改使用Unity3D开发的Android游戏的playerprefs文件不起作用?

时间:2015-10-19 17:10:02

标签: android unity3d sharedpreferences

我在我的root手机上安装了游戏。我想要更多硬币。而且我知道,播放器数据是使用playerprefs存储的。(我有一部分游戏的源代码。)所以我编辑了xml文件,它位于

/data/data/appname/shared_prefs/appname.xml

我编辑了相应数量的硬币。但是当游戏启动时,硬币的数量并不是我想要的。然后我再次打开xml文件,只发现修改了修改。我试了很多次。

我该怎么办?

1 个答案:

答案 0 :(得分:6)

你应该发布或创建一个miniumum,完整且可验证的例子,但我现在会自己做。我创建了一个新的Unity项目,并将该脚本附加到主摄像头:

svg:hover {
    fill: #00599c;
}

如果密钥不存在(首次运行),脚本将创建密钥using UnityEngine; using System.Collections; public class PlayerPrefsScript : MonoBehaviour { private int readCoins; void Start() { if (!PlayerPrefs.HasKey("coins")) { PlayerPrefs.SetInt("coins", 1); PlayerPrefs.Save(); } readCoins = PlayerPrefs.GetInt("coins"); } void OnGUI() { GUI.Box(new Rect(Screen.width / 2 - 150 / 2, Screen.height / 2 - 25 / 2, 150, 25), "Coins: " + readCoins.ToString("N0")); } } 并将值1保存在其中。然后,在"coins"项下保存的内容的值将保存在"coins"中。在readCoins中,它绘制一个简单的150x25像素的框,显示读取的硬币数量。很简单,如果您为Android编译应用程序并让它运行(我在BlueStacks模拟器中执行此操作),您会看到:

start1

您可以在文件系统中看到,PlayerPrefs已保存在您预测的位置。

OnGUI()

它为您提供了XML:

C:\>adb connect 127.0.0.1:5556
connected to 127.0.0.1:5556
C:\>adb.exe -s emulator-5556 shell
root@generic:/ # cd /data/data/com.mycompany.PlayerPrefsTest/shared_prefs && ls -lh
-rw-rw---- u0_a58   u0_a58        361 2015-10-19 19:01 com.mycompany.PlayerPrefsTest.xml
root@generic:[..]/cat com.mycompany.PlayerPrefsTest.xml

所以我把它编辑到了999999并得到了

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <int name="coins" value="1" />
    <int name="Screenmanager Resolution Height" value="1920" />
    <string name="5.2.1">293797f02df348f6b7238da14b30277d</string>
    <int name="Screenmanager Is Fullscreen mode" value="0" />
    <int name="Screenmanager Resolution Width" value="1080" />
</map>

再次启动游戏......

start2

结论

有些事你不知道。如果游戏只是读取该值,它应该像我演示的那样工作。因此,也许游戏会以另一种格式保存它,或者如果它检测到分数的异常变化,则具有备用值。即使略微增加硬币也会导致价值被重置?在这种情况下,只有进一步逆向工程应用程序才能帮助您找到这里发生的事情。但是你现在可以排除简单的C:\>adb.exe -s emulator-5556 pull "/data/data/com.mycompany.PlayerPrefsTest/shared_prefs/com.mycompany.PlayerPrefsTest.xml" prefs.xml 64 KB/s (361 bytes in 0.005s) *edit it* C:\>adb.exe -s emulator-5556 push prefs.xml "/data/data/com.mycompany.PlayerPrefsTest/shared_prefs/com.mycompany.PlayerPrefsTest.xml" 4 KB/s (366 bytes in 0.085s)

从这里开始

如果您对应用程序进行逆向工程是合法的,请从their google driveproject page获取最新的Android MuliTool(漂亮的一体化工具)并运行反编译器它。我会在这里展示我的应用程序。 decom

在解压缩的工具文件夹中,在“Decompiled apk”下,您将找到应用程序的文件夹结构。

PlayerPrefs.GetInt()

所有已编译的C#脚本都位于assets \ bin \ Managed下的“Assembly.CSharp.dll”文件中。抓住Telerik的反编译器“JustDecompile”(website)并在其上运行文件。您将能够看到所有脚本都在各自的命名空间(在我的情况下是默认命名空间),并且反编译器将以可读的C#语法从脚本输出编译的MSIL代码:

telerik

因此,所有脚本都可以以易读的格式再次检索。