c# - unity application persistentdatapath location
UbicaciĆ³n de Application.persistentDataPath en una compilaciĆ³n (1)
En la respuesta a continuación:
- companyname = Nombre de la empresa desde la configuración de compilación
- nombre del producto = nombre del producto de la configuración de compilación
Windows :
C:/Users/<userprofile>/AppData/LocalLow/<companyname>/<productname>
Tienda de Windows :
%userprofile%/AppData/Local/Packages/<productname>/LocalState
Mac :
~/Library/Application Support/companyname/productname
versión anterior de Unity en Mac:
~/Library/Caches folder
~/Library/Application Support/unity.companyname.productname.
Linux :
$XDG_CONFIG_HOME/unity3d/<companyname>/<productname>
que es lo mismo que
~/.config/unity3d/<companyname>/<productname>
Android :
/Data/Data/com.<companyname>.<productname>/files
con tarjeta SD en el dispositivo Android:
/storage/sdcard0/Android/data/com.<companyname>.<productname>/files
iOS :
/var/mobile/Containers/Data/Application/<RandomFolderName>/Documents
Ejemplo del nombre completo RandomFolderName:
/var/mobile/Containers/Data/Application/<055811B9-D125-41B1-A078-F898B06F8C58>/Documents
En iOS, se te dará acceso a la zona de pruebas de la aplicación, que es la carpeta del documento. Debe crear una carpeta dentro de este directorio para crear un nuevo archivo dentro de ella.
Si tiene valores de datos predeterminados en un archivo json, coloque el archivo en la carpeta Activos / Recursos para que sea de solo lectura y luego TextAsset
con TextAsset
. Cuando se carga el juego, puedes usar PlayerPrefs
para verificar si es la primera vez que se carga el juego.
Si esta es la primera vez, use el valor de TextAsset.text
. Si no se usa, entonces el valor se guardó con la clase DataHandler
.
Aproximadamente algo como esto:
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");
}
Cuando ejecuto mi juego desde el editor y guardo datos de carga, encuentro los datos en: C:/Users/User/AppData/LocalLow/DefaultCompany/projectname/data
.
Cuando lo construyo y obtengo un ejecutable, esos datos todavía se cargan bien, pero si los guardo y reinicio, no se guardan. Sin embargo, lo hace cuando lo lanzo desde el Editor.
¿Es esto un error en mi código o los archivos en otro lugar cuando no lo ejecuto desde Unity Editor?
Más tarde, cuando exporto el juego para lanzarlo, tengo archivos I Json de datos persistentes que tienen que venir para que el juego funcione.
Para mayor claridad, esta es la clase que maneja guardar / cargar de 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;
}
}