从 Unity 3D 游戏保存文件到 IOS
saving files on IOS from a Unity 3D game
好的,所以我遵循了 unity3d.com(位于 here)
的教程
为了让您不必或不想观看整个视频,这里是 save/load 功能。
//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
时有效,但在我们 "force close" 应用程序(即使用 ipad 正面按钮)时无效。需要帮助
好的,事实证明,当我们在移动设备上使用主页按钮停止 Unity 游戏时,方法 OnEnable/OnDisable 似乎没有调用或正常工作。所以我的解决方法是将save代码迁移到OnApplicationPause(bool pauseStatus)
方法中。经过几次测试后,似乎每次您按下主屏幕时都会调用它,从而确保游戏自动保存。
然而,这只解决了 android 设备上的问题。有人请告诉我当 IOS 用户按下主页按钮时会发生什么,这样我就可以在这种情况下保存我的游戏。
已解决问题。经过一些调试后发现 ios 和 .Net JIT 不喜欢对方。此代码修复了问题:
if (Application.platform == RuntimePlatform.IPhonePlayer)
{
System.Environment.SetEnvironmentVariable("MONO_REFLECTION_SERIALIZER", "yes");
}
我建议将它放在 Awake() 方法中。
好的,所以我遵循了 unity3d.com(位于 here)
的教程为了让您不必或不想观看整个视频,这里是 save/load 功能。
//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
时有效,但在我们 "force close" 应用程序(即使用 ipad 正面按钮)时无效。需要帮助
好的,事实证明,当我们在移动设备上使用主页按钮停止 Unity 游戏时,方法 OnEnable/OnDisable 似乎没有调用或正常工作。所以我的解决方法是将save代码迁移到OnApplicationPause(bool pauseStatus)
方法中。经过几次测试后,似乎每次您按下主屏幕时都会调用它,从而确保游戏自动保存。
然而,这只解决了 android 设备上的问题。有人请告诉我当 IOS 用户按下主页按钮时会发生什么,这样我就可以在这种情况下保存我的游戏。
已解决问题。经过一些调试后发现 ios 和 .Net JIT 不喜欢对方。此代码修复了问题:
if (Application.platform == RuntimePlatform.IPhonePlayer)
{
System.Environment.SetEnvironmentVariable("MONO_REFLECTION_SERIALIZER", "yes");
}
我建议将它放在 Awake() 方法中。