当我从编辑器运行游戏并保存加载数据时,我会在C:\Users\User\AppData\LocalLow\DefaultCompany\projectname\data
中找到该数据。
当我构建它并获得可执行文件时,该数据仍然正常加载,但如果我保存并重新启动,则不会保存。但是当我从编辑器中启动它时它会这样做。
这是我的代码中的错误,还是我从Unity Editor运行它时的其他文件?
稍后当我导出游戏以启动游戏时,我会拥有持久数据I Json文件,这些文件必须与游戏一起使用。
为清楚起见,here是处理Json的保存/加载的类:
public class DataHandler
{
//Save Data
public static void saveData<T>(T dataToSave, string dataFileName)
{
string tempPath = Path.Combine(Application.persistentDataPath, "data");
tempPath = Path.Combine(tempPath, dataFileName + ".txt");
//Convert To Json then to bytes
string jsonData = JsonUtility.ToJson(dataToSave, true);
byte[] jsonByte = Encoding.ASCII.GetBytes(jsonData);
//Create Directory if it does not exist
if (!Directory.Exists(Path.GetDirectoryName(tempPath)))
{
Directory.CreateDirectory(Path.GetDirectoryName(tempPath));
}
//Debug.Log(path);
try
{
File.WriteAllBytes(tempPath, jsonByte);
Debug.Log("Saved Data to: " + tempPath.Replace("/", "\\"));
}
catch (Exception e)
{
Debug.LogWarning("Failed To PlayerInfo Data to: " + tempPath.Replace("/", "\\"));
Debug.LogWarning("Error: " + e.Message);
}
}
//Load Data
public static T loadData<T>(string dataFileName)
{
string tempPath = Path.Combine(Application.persistentDataPath, "data");
tempPath = Path.Combine(tempPath, dataFileName + ".txt");
//Exit if Directory or File does not exist
if (!Directory.Exists(Path.GetDirectoryName(tempPath)))
{
Debug.LogWarning("Directory does not exist");
return default(T);
}
if (!File.Exists(tempPath))
{
Debug.Log("File does not exist");
return default(T);
}
//Load saved Json
byte[] jsonByte = null;
try
{
jsonByte = File.ReadAllBytes(tempPath);
Debug.Log("Loaded Data from: " + tempPath.Replace("/", "\\"));
}
catch (Exception e)
{
Debug.LogWarning("Failed To Load Data from: " + tempPath.Replace("/", "\\"));
Debug.LogWarning("Error: " + e.Message);
}
//Convert to json string
string jsonData = Encoding.ASCII.GetString(jsonByte);
//Convert to Object
object resultValue = JsonUtility.FromJson<T>(jsonData);
return (T)Convert.ChangeType(resultValue, typeof(T));
}
public static bool deleteData(string dataFileName)
{
bool success = false;
//Load Data
string tempPath = Path.Combine(Application.persistentDataPath, "data");
tempPath = Path.Combine(tempPath, dataFileName + ".txt");
//Exit if Directory or File does not exist
if (!Directory.Exists(Path.GetDirectoryName(tempPath)))
{
Debug.LogWarning("Directory does not exist");
return false;
}
if (!File.Exists(tempPath))
{
Debug.Log("File does not exist");
return false;
}
try
{
File.Delete(tempPath);
Debug.Log("Data deleted from: " + tempPath.Replace("/", "\\"));
success = true;
}
catch (Exception e)
{
Debug.LogWarning("Failed To Delete Data: " + e.Message);
}
return success;
}
}
答案 0 :(得分:12)
在下面的答案中:
<强>窗强>:
C:\Users\<userprofile>\AppData\LocalLow\<companyname>\<productname>
Windows应用商店:
%userprofile%\AppData\Local\Packages\<productname>\LocalState
<强>苹果强>:
~/Library/Application Support/companyname/productname
旧版Unity on Mac:
~/Library/Caches folder
~/Library/Application Support/unity.companyname.productname.
<强>的Linux 强>:
$XDG_CONFIG_HOME/unity3d/<companyname>/<productname>
与
相同~/.config/unity3d/<companyname>/<productname>
<强>的Android 强>:
/Data/Data/com.<companyname>.<productname>/files
在Android设备上使用SD卡:
/storage/sdcard0/Android/data/com.<companyname>.<productname>/files
<强>的iOS 强>:
/var/mobile/Containers/Data/Application/<RandomFolderName>/Documents
RandomFolderName全名的示例:
/var/mobile/Containers/Data/Application/<055811B9-D125-41B1-A078-F898B06F8C58>/Documents
在iOS上,您将可以访问应用程序的沙盒,即文件夹。您必须在此目录中创建文件夹才能在其中创建新文件。
如果您在json文件中有默认数据值,请将该文件放在 Assets / Resources 文件夹中,使其成为只读,然后使用{读取它{3}}。加载游戏后,您可以使用PlayerPrefs
检查这是否是正在加载的游戏的TextAsset
。
如果这是第一次,请使用first time中的值。如果不使用,则使用DataHandler
类保存值。
大概是这样的:
if (PlayerPrefs.GetInt("FIRSTTIMEOPENING", 1) == 1)
{
Debug.Log("First Time Opening");
//Set first time opening to false
PlayerPrefs.SetInt("FIRSTTIMEOPENING", 0);
//USE TextAsset to load data
TextAsset txtAsset = (TextAsset)Resources.Load("player", typeof(TextAsset));
string tileFile = txtAsset.text;
PlayerInfo pInfo = JsonUtility.FromJson<PlayerInfo>(tileFile);
}
else
{
Debug.Log("NOT First Time Opening");
//USE DataHandler to load data
PlayerInfo pInfo = DataHandler.loadData<PlayerInfo>("player");
}