Application.persistentDataPath在构建中的位置 [英] Location of Application.persistentDataPath in a build

查看:2043
本文介绍了Application.persistentDataPath在构建中的位置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

When I run my game from the editor and save load data, I find that data in: C:\Users\User\AppData\LocalLow\DefaultCompany\projectname\data.

当我构建它并获取可执行文件时,该数据仍然可以正常加载,但是如果我保存并重新启动,则不会保存该数据.但是,当我从编辑器中启动它时,它确实会发生.

When I build it and get an executable, that data still loads fine, but if I save and restart, it does not get saved. However it does when I launch it from the Editor.

这是我的代码中的错误,还是我没有从Unity Editor运行它时文件在其他地方?

Is this a fault in my code or is the files somewhere else when I don't run it from Unity Editor?

稍后,当我导出游戏以启动游戏时,我拥有Json文件的持久性数据,该文件必须随游戏一起运行.

Later when I export the game to launch it, I have persistent data I Json files that have to come with it for the game to work.

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

For clarity, here is the class that handles save/load of 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;
    }
}

推荐答案

在下面的答案中:

  • 公司名称 = 构建设置
  • 中的公司名称
  • 产品名称 = 构建设置
  • 中的产品名称
  • companyname = Company name from the Build Settings
  • productname = Product name from the Build Settings

Windows :

C:\Users\<userprofile>\AppData\LocalLow\<companyname>\<productname>

Windows应用商店:

%userprofile%\AppData\Local\Packages\<productname>\LocalState


Mac :

~/Library/Application Support/companyname/productname

在Mac上旧版本的Unity:

older version of 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卡:

with SD card on the Android device:

/storage/sdcard0/Android/data/com.<companyname>.<productname>/files

iOS :

/var/mobile/Containers/Data/Application/<RandomFolderName>/Documents

RandomFolderName全名的示例:

Example of the RandomFolderName full name:

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

在iOS上,您将获得对应用程序沙箱(即文档"文件夹)的访问权限.您必须在此目录内创建文件夹才能在其中创建新文件.

On iOS, you will be given access to the app's sandbox which is the Document folder. You must create folder inside this directory in order to create a new file inside it.

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

If you have a default data values in a json file, put the file in Assets/Resources folder so that it will be read-only then read it with TextAsset. When the game loads, you can use PlayerPrefs to check if this is the first time the game being loaded.

如果是第一次,请使用 TextAsset.text 中的值.如果未使用,则将值保存在DataHandler类中.

If this is the first time, use the value from TextAsset.text. If it is not use then value saved with the DataHandler class.

大致是这样的:

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");
}

这篇关于Application.persistentDataPath在构建中的位置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆