【问题标题】:Writing to Application.persistentDataPath on HoloLens 2 with Unity3D and accessing files afterward through device web portal使用 Unity3D 写入 HoloLens 2 上的 Application.persistentDataPath,然后通过设备门户网站访问文件
【发布时间】:2021-06-28 16:56:50
【问题描述】:

我正在开发 Unity 3D 中的 Hololens 2 应用程序。我正在尝试将配置文件写入设备并稍后通过 Web 浏览器中的设备门户访问它。在应用程序本身中,我被告知该文件正在写入 AppData/Local/Packages/[App Name]/LocalState/[File Name].txt。但是,当我去查看 LocalAppData/[App Name] 时,文件夹 LocalState/ 甚至都不存在。我怀疑这与 Unity 生成的 VS 项目的 Package.appxmanifest 文件中的错误有关。

这是我用来写入文件的相关 C# 代码:

   void ReadResolution()
    {
        string path = Path.Combine(Application.persistentDataPath, mResFilename);
        mExcept = $"No exceptions thrown by file IO while writing to \n\"{path}\".";
        if(System.IO.File.Exists(path) && new FileInfo(path).Length > 0)
        {
            try
            {
                StreamReader reader = new StreamReader(path);
                if(reader != null)
                {
                    string content = reader.ReadToEnd();
                    string[] split = content.Split(' ');
                    mWidth = Int32.Parse(split[0]);
                    mHeight = Int32.Parse(split[1]);
                }
            }
            catch (Exception e)
            {
                mExcept = "File Read Exception: " + e.Message;
            }
        }
        else
        {
            try
            {
                using (TextWriter writer = File.CreateText(path))
                {
                    string line = mWidth.ToString() + " " + mHeight.ToString();
                    writer.WriteLine(line);
                }
            }
            catch (Exception e)
            {
                mExcept = "File Write Exception: " + e.Message;
            }
        }
        Debug.Log(mExcept);
    }

我正在使用成员字段 mExcept 来记录过程中抛出的任何消息或异常。它告诉我文件写入成功,但也许我只是在自欺欺人?

以下是项目的 Package.appxmanifest 文件中的相关部分:

<Package xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest" 
         xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" 
         xmlns:uap2="http://schemas.microsoft.com/appx/manifest/uap/windows10/2" 
         xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3" 
         xmlns:uap4="http://schemas.microsoft.com/appx/manifest/uap/windows10/4" 
         xmlns:iot="http://schemas.microsoft.com/appx/manifest/iot/windows10" 
         xmlns:mobile="http://schemas.microsoft.com/appx/manifest/mobile/windows10"
         xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
         IgnorableNamespaces="uap uap2 uap3 uap4 mp mobile iot rescap" 
         xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10">

.
.
.

  <Capabilities>
    <rescap:Capability Name="broadFileSystemAccess" />
    <uap:Capability Name="documentsLibrary" />
    <Capability Name="internetClient" />
    <Capability Name="internetClientServer" />
    <Capability Name="privateNetworkClientServer" />
    <uap2:Capability Name="spatialPerception" />
    <uap3:Capability Name="remoteSystem" />
    <DeviceCapability Name="microphone" />
    <DeviceCapability Name="gazeinput" />
    <DeviceCapability Name="wiFiControl" />
    <DeviceCapability Name="webcam" />
  </Capabilities>

感谢任何帮助。提前致谢。

【问题讨论】:

  • LocalAppData/[App Name] != AppData/Local/Packages/[App Name] 不过! ...你确定你在正确的地方搜索吗?
  • 所以我的理解是,Windows 会根据您从哪里查看路径(应用程序与门户网站)来调整路径。我正在寻找其他应用程序写入存储的文件出现的地方。因此,对于我正在使用的其他一些应用程序,事情将进入 LocalAppData[App Name]\LocalState\。我的应用不存在 LocalState 文件夹。

标签: c# unity3d uwp io hololens


【解决方案1】:

好的,我想通了。

为了写入持久存储,Unity 生成的 VS 项目需要在其 Package.appxmanifest 文件中包含我所缺少的另一个功能。也就是说,除了您正在使用的任何其他内容之外,您还需要声明 uap 功能“removableStorage”。例如,这就是我的清单文件的功能部分现在的样子:

<Capabilities>
    <uap:Capability Name="documentsLibrary" />
    <Capability Name="internetClient" />
    <Capability Name="internetClientServer" />
    <Capability Name="privateNetworkClientServer" />
    <uap:Capability Name="removableStorage" />
    <uap:Capability Name="videosLibrary" />
    <uap:Capability Name="objects3D" />
    <uap2:Capability Name="spatialPerception" />
    <DeviceCapability Name="webcam" />
    <DeviceCapability Name="microphone" />
    <DeviceCapability Name="location" />
    <DeviceCapability Name="wiFiControl" />
  </Capabilities>

另外,请确保在安装固定版本之前完全卸载设备上的所有旧版本。这也给我带来了麻烦。

祝你有美好的一天:)

【讨论】:

    【解决方案2】:

    我还在 Unity 中使用了 Application.persistentDataPath,它必须在 Hololens 2 上工作。

    但是它不起作用,即;文件未保存,因为我犯了一个错误(我要保存的列表未初始化为新列表)。

    在我更正之后,带有列表的文件将保存在persistantDatapath 上,并且无需添加上述功能即可工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-19
      • 2019-10-05
      • 2019-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多