Application.persistentDataPath在构建中的位置

当我从编辑器运行我的游戏并保存加载数据时,我在以下位置找到该数据: C:\Users\User\AppData\LocalLow\DefaultCompany\projectname\data

当我构建它并获得可执行文件时,该数据仍然正常加载,但如果我保存并重新启动,则不会保存。 但是,当我从编辑器中启动它时它会这样做。

这是我的代码中的错误,还是当我不从Unity Editor运行它时的其他文件?

后来当我导出游戏以启动它时,我有持久的数据I Json文件,它必须与它一起使游戏工作。

为清楚起见, 这里是处理Json的保存/加载的类:

 public class DataHandler { //Save Data public static void saveData(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(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(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; } } 

在下面的答案中:

  • companyname = 构建设置中的公司名称
  • productname = 构建设置中的产品名称

在此处输入图像描述

Windows

 C:\Users\\AppData\LocalLow\\ 

Windowsapp store

 %userprofile%\AppData\Local\Packages\\LocalState 

Mac

 ~/Library/Application Support/companyname/productname 

旧版Unity on Mac:

  • ~/Library/Caches folder

  • ~/Library/Application Support/unity.companyname.productname.

Linux

 $XDG_CONFIG_HOME/unity3d// 

这与…相同

 ~/.config/unity3d// 

Android

 /Data/Data/com../files 

在Android设备上使用SD卡:

 /storage/sdcard0/Android/data/com../files 

iOS

 /var/mobile/Containers/Data/Application//Documents 

RandomFolderName全名的示例:

 /var/mobile/Containers/Data/Application/<055811B9-D125-41B1-A078-F898B06F8C58>/Documents 

在iOS上,您将可以访问应用程序的沙箱,即文件夹。 您必须在此目录中创建文件夹才能在其中创建新文件。


如果json文件中有默认数据值,请将该文件放在Assets / Resources文件夹中,以使其为只读,然后使用TextAsset读取它。 加载游戏时,您可以使用PlayerPrefs来检查这是否是第一次加载游戏。

如果这是第一次,请使用TextAsset.text的值。 如果不使用,则使用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(tileFile); } else { Debug.Log("NOT First Time Opening"); //USE DataHandler to load data PlayerInfo pInfo = DataHandler.loadData("player"); }