使用 Unity3D 写入 HoloLens 2 上的 Application.persistentDataPath,然后通过设备门户网站访问文件

Posted

技术标签:

【中文标题】使用 Unity3D 写入 HoloLens 2 上的 Application.persistentDataPath,然后通过设备门户网站访问文件【英文标题】:Writing to Application.persistentDataPath on HoloLens 2 with Unity3D and accessing files afterward through device web portal 【发布时间】: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 文件夹。 【参考方案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 上,并且无需添加上述功能即可工作。

【讨论】:

以上是关于使用 Unity3D 写入 HoloLens 2 上的 Application.persistentDataPath,然后通过设备门户网站访问文件的主要内容,如果未能解决你的问题,请参考以下文章

Unity3D Hololens 访问 Windows.Storage.KnownFolders

Unity3D UWP Hololens:使用 InputField 的 Web 门户输入而不会弹出 TouchScreenKeyboard

Unity UI on hololens

Hololens - 访问相机框架

从 PC 直播到 HoloLens 2 的方法

使用 Hololens 2 在空间映射网格上生成对象