unity3d 应用程序.persistenDataPath不再工作

wr98u20j  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(128)

从昨天晚上开始,我的Application.persistenDataPath在代码中的一个地方不再工作了。我用了两次。第一次它工作了,第二次它不再工作了。
也许给你一个提示,我昨天经常保存json。而且我有无限循环,这可能导致应用程序设置崩溃。在Android Build上,它工作得很好。(我在两种用法中都得到了正确的路径)

  • 我尝试过的代码 *
  • 都在同一个类中。
  • 统一2021.3.2f
  • 使用Google Firebase
  • Visual Studio 2022社区版
    **这是它工作的代码:**我正在保存一张照片到给定的路径。
//then Save To Disk as PNG
            byte[] bytes = avatarTexture.EncodeToPNG();
            var dirPath = Application.persistentDataPath + "/Resources/User/";
            if (!Directory.Exists(dirPath))
            {
                Directory.CreateDirectory(dirPath);
            }
            if (File.Exists(dirPath + "avatar" + ".png"))
            {
                File.Delete(dirPath + "avatar" + ".png");
            }
            File.WriteAllBytes(dirPath + "avatar" + ".png", bytes);

            saveUserDataAsJson(getUserToken(user.DisplayName, user.Email));
            _warningLoginText.text = "";
            _confirmLoginText.text = Translation.authManager_login_notification_loginSucceeded;

**这是它不工作的代码:**我正在保存一个包含用户信息的JSON文件。

DataSnapshot snapshotYear = taskYear.Result;
_year = Convert.ToInt32(snapshotYear.Value);
FirebaseDatabaseUser tempUser = new FirebaseDatabaseUser(_token, _day, _month, _year);
var json = JsonConvert.SerializeObject(tempUser);

Debug.Log("Can see it in Console");

//After pressing Play Button in Unity
//Editor i get no Debug outprint here
Debug.Log(Application.persistentDataPath);

var folderPath = Application.persistentDataPath + "/Resources/User/";

Debug.Log("Can not see it in Console");
//HERE THE CODE STOPS AND NOTHING HAPPEN
//NO ERROR NO LOG NO FURTHER CODE WORKING
//HERE NOT WORKING ANYMORE


if (!Directory.Exists(folderPath))
{
    Directory.CreateDirectory(folderPath);
}
if (File.Exists(folderPath + "userdata" + ".json"))
{
    File.Delete(folderPath + "userdata" + ".json");
}
File.WriteAllText(folderPath + "userdata" + ".json", json);

我试过:

  • 重建项目设置
  • 在控制台中打印路径,它是空的“”
  • 已清理GI缓存
  • 已重新启动我的计算机
  • 克隆项目新建
  • 尝试使用Application.dataPath(仅用于调试测试,而不是在我的代码中使用它)也不工作在Unity播放模式,但在Android上它指向APK的权利。

第一次使用(在代码中工作的地方)我得到路径:电脑:C:\Users\{user}\AppData\LocalLow\{company}\{app}\Resources\User\安卓系统:.\Android\data\com.{company}.{app}\...\Resources\User\
第二种用法(放置在代码中不起作用的地方)I get Path:电脑:“”安卓系统:“.\Android\data\com.{company}.{app}\...\Resources\User\
我希望有人能解释这个问题。我不能解决这个问题从我自己。需要有人谁有更多的背景知识。

j9per5c4

j9per5c41#

因此答案基于***@derHugo*的帮助:
有些Unity API只使用Unity主线程。Application.persistentDataPath是Unity API元素的一部分。因此,问题是,在
第一个代码片段中,我使用了Unity主线程**,但在第二个代码片段中,我使用了后台线程。这很容易修复。我没有使用其他线程,而是使用了:

`<myasyncfunction>.ContinueWithOnMainThread(task => {....
    //second code snippet
})`

重构提示此代码:

  • File.Exists可以被删除,它是完全冗余的。WriteAllText在默认情况下创建或覆盖该文件。
  • 一遍又一遍地构造数据路径是没有意义的。更好的方法是创建public static readonly路径并使用它们来代替。

希望***@derHugo***的解决方案能帮助其他人。
如果你读到这篇文章,祝你有愉快的一天:)

相关问题