【发布时间】:2020-05-18 12:12:10
【问题描述】:
我正在构建一个 Android 游戏,“选项”菜单提供 3 种不同的设置:背景音乐音量、音效音量和射击按钮的屏幕侧位置。还有应该保存的高分。
我尝试根据某人提供的答案创建脚本,但是当我使用音乐音量滑块对其进行测试时,它不断返回有关无法序列化的内容的错误。起初它说“SerializationException: Type 'GameData' in Assembly 'Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' 未标记为可序列化”,所以我尝试添加“[System.Serializable]”在某处建议的类代码上方,但现在它返回错误“SerializationException: Type 'UnityEngine.MonoBehaviour' in Assembly 'UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' is notmarked as serializable ”。
此外,在序列化错误之后,它还会写入错误“IOException:在路径 C:\Users\UserName\AppData\LocalLow\CompanyName\AppName\save.dat 上共享冲突”。
代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Security.Cryptography;
[System.Serializable]
public class GameData : MonoBehaviour
{
public int highScore = 0;
public float musicVol = 1;
public float sfxVol = 1;
public int shootSide = 1;
// Start is called before the first frame update
private void Start()
{
LoadFile();
}
public void HighScoreValue(int highS)
{
highScore = highS;
SaveData();
}
public void MusicValue(float musicV)
{
musicVol = musicV;
SaveData();
}
public void SfxValue(float sfxV)
{
sfxVol = sfxV;
SaveData();
}
public void ShootSideValue(int shootS)
{
shootSide = shootS;
SaveData();
}
private void SaveData()
{
string destination = Application.persistentDataPath + "/save.dat";
FileStream file;
if (File.Exists(destination))
{
file = File.OpenWrite(destination);
}
else
{
file = File.Create(destination);
}
GameData data = gameObject.AddComponent<GameData>();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(file, data);
file.Close();
}
private void LoadFile()
{
string destination = Application.persistentDataPath + "/save.dat";
FileStream file;
if (File.Exists(destination))
{
file = File.OpenRead(destination);
}
else
{
Debug.Log("File not found");
return;
}
BinaryFormatter formatter = new BinaryFormatter();
GameData data = (GameData)formatter.Deserialize(file);
file.Close();
highScore = data.highScore;
musicVol = data.musicVol;
sfxVol = data.sfxVol;
shootSide = data.shootSide;
}
}
代码有什么问题?提前致谢。
【问题讨论】: