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

heL*_*maN 0 android unity-game-engine sharedpreferences

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

/data/data/appname/shared_prefs/appname.xml
Run Code Online (Sandbox Code Playgroud)

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

我该怎么办?

Max*_*rdt 6

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

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"));
    }

}
Run Code Online (Sandbox Code Playgroud)

"coins"如果密钥不存在(首次运行),脚本将创建密钥并将值1保存在其中.那么,什么是下键保存的该值"coins"将被保存在readCoins.在OnGUI()它中绘制一个简单的150x25像素的盒子,它将显示读取的硬币数量.很简单,如果您为Android编译应用程序并让它运行(我在BlueStacks模拟器中执行此操作),您会看到:

启动1

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

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
Run Code Online (Sandbox Code Playgroud)

这给你XML:

<?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>
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

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

START2

结论

你不知道有什么事情发生.如果游戏只是读取该值,它应该像我演示的那样工作.因此,也许游戏会以另一种格式保存它,或者如果它检测到分数的异常变化,则具有备用值.即使略微增加硬币也会导致价值被重置?在这种情况下,只有进一步逆向工程应用程序才能帮助您找到这里发生的事情.但你PlayerPrefs.GetInt()现在可以排除这个简单了.

从这往哪儿走

如果您在应用程序上进行逆向工程是合法的,请从他们的google驱动器,项目页面获取最新的Android MuliTool(漂亮的一体化工具)并在其上运行反编译器.我会在这里展示我的应用程序. DECOM

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

????app
    ?   AndroidManifest.xml
    ?   apktool.yml
    ?
    ????assets
    ?   ????bin
    ?       ????Data
    ?           ?   mainData
    ?           ?   settings.xml
    ?           ?   sharedassets0.assets
    ?           ?   splash.png
    ?           ?   unity default resources
    ?           ?
    ?           ????Managed
    ?           ?       Assembly-CSharp.dll
    ?           ?       Mono.Security.dll
    ?           ?       mscorlib.dll
    ?           ?       System.Core.dll
    ?           ?       System.dll
    ?           ?       UnityEngine.dll
    ?           ?       UnityEngine.dll.mdb
    ?           ?       UnityEngine.Networking.dll
    ?           ?       UnityEngine.UI.dll
    ?           ?       UnityEngine.xml
    ?           ?
    ?           ????Resources
    ?                   unity_builtin_extra
    ...
Run Code Online (Sandbox Code Playgroud)

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

Telerik的

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