【问题标题】:saving files on IOS from a Unity 3D game将文件从 Unity 3D 游戏保存到 IOS
【发布时间】:2015-02-17 22:11:14
【问题描述】:

好的,所以我按照unity3d.com(位于here)上的教程进行操作

只是为了让您不必或不想观看整个视频,这里是保存/加载功能。

//This one saves/creates the file
    void OnDisable()
        {
            BinaryFormatter binFormatter = new BinaryFormatter();
            FileStream file = File.Create(Application.persistentDataPath + "/savedgame.dat");
            GameData data = new GameData();
            data.coinAmount = coinAmount;
            data.upgradeLevel = upgradeLevel;

            binFormatter.Serialize(file, data);
            file.Close();
        }
//And this one loads it 
 void OnEnable()
    {

        if (File.Exists(Application.persistentDataPath + "/savedgame.dat"))
        {
            BinaryFormatter binFormatter = new BinaryFormatter();

            FileStream file = File.Open(Application.persistentDataPath + "/savedgame.dat",FileMode.Open);
            GameData data = (GameData)binFormatter.Deserialize(file) ;
            file.Close();
            coinAmount = data.coinAmount;
            upgradeLevel = data.upgradeLevel;

        }

    }

我正在使用 OnDisable/OnEnable,以便每次用户退出时我的游戏都会自动保存。这适用于 pc 和 mac,但是当我将它构建到 Ipad air2 时,它就像什么都没有发生。 Xcode 抛出一个异常,显示未知文件名(-1)。 在此先感谢您的帮助 在对 android 进行进一步调查后,发现文件被创建并且游戏从中读取数据。问题就在这里:

data.coinAmount = coinAmount;
data.upgradeLevel = upgradeLevel;

由于某种原因,当应用程序在 Android 上运行时,这不会写入正确的数据(对于 IOS 可能相同)。 当我提供硬编码值时,即:data.coinAmount = 100;,游戏就会正确读取它。

进一步调查发现,当您调用 Application.quit 时,代码可以工作,但在我们“强制关闭”应用程序(即使用 ipad 前按钮)时,该代码不起作用。需要帮助

【问题讨论】:

  • 还在 android 上测试了这段代码,再次没有任何效果。该文件很简单,没有被创建。我缺少一些权限还是什么?
  • 在类前加Serializable属性吗?
  • 是的,否则它将无法在 linux mac 和 windows 上运行。它根本行不通。经过更多调试后,我发现我确实读取了这些文件,但由于某种原因,它们没有被正确保存。现在,如果我将安全函数中的 data.coinAmount 更改为静态 100,一切都很好。

标签: c# ios unity3d


【解决方案1】:

好的,当我们使用移动设备上的主页按钮停止 Unity 游戏时,我们似乎无法调用 OnEnable/OnDisable 方法或正常工作。所以我解决问题的方法是将保存代码迁移到OnApplicationPause(bool pauseStatus)方法。经过几次测试后,似乎每次按下主屏幕时都会调用它,从而确保游戏自动保存。

不过,这只修复了 Android 设备上的问题。有人请告诉我当 IOS 用户按下主页按钮时会发生什么,这样我就可以在发生这种情况时保存我的游戏。

解决了这个问题。经过一些调试,结果发现 ios 和 .Net JIT 彼此不喜欢。这段代码解决了这个问题:

if (Application.platform == RuntimePlatform.IPhonePlayer)
        {
            System.Environment.SetEnvironmentVariable("MONO_REFLECTION_SERIALIZER", "yes");
        } 

我建议将它放在 Awake() 方法中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-13
    • 2016-11-29
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多