如何访问Hololens 3D对象文件夹中的文件

问题描述 投票:-1回答:1

我正在使用Trilib加载3D模型的应用程序。当前,该应用程序可在Unity中运行,并且PC 3D模型文件夹中的任何fbx文件都可以通过远程全息术加载到HoloLens中。.当我构建该应用程序并将其部署到HL时,我看不到任何文件。我已经为3D对象文件夹设置了权限。

using System;
using System.Collections;
using System.Linq;
using System.IO;
using UnityEngine;
using Microsoft.MixedReality.Toolkit.UI;
using Microsoft.MixedReality.Toolkit.Experimental.UI;
using TMPro;
using TriLib;

#if ENABLE_WINMD_SUPPORT
using System.Threading.Tasks;
using Windows.Storage;
#endif

#if UNITY_EDITOR
using UnityEditor;
#endif

namespace HololensProject {

    public class HModelLoader : SingletonBehaviour<HModelLoader> {

        [Header("UI")]
        [SerializeField] private Transform m_content;
        [SerializeField] private ScrollingObjectCollection m_scrollingCollection;
        [SerializeField] private GameObject m_textButtonPrefab;
        [SerializeField] private TextMeshPro m_currentPathTMP;

        [Header("Model Load")]
        [SerializeField] private Transform m_modelLoadArea;
        [SerializeField] private RuntimeAnimatorController m_runtimeAnimatorController;
        [SerializeField] private GameObject m_modelComponentPrefab;

        [SerializeField, HideInInspector] private byte[] m_defaultModelData;
        private static string[] m_directoryFiles;

        void Awake() {
            m_content.gameObject.GetChilds().Destroy();
            m_scrollingCollection.UpdateCollection();

            StartCoroutine(ListModels());
        }

        IEnumerator LoadModels() {
            var loaded = false;

#if ENABLE_WINMD_SUPPORT
            Task.Run(async () => {
                if (await KnownFolders.Objects3D.TryGetItemAsync("molecule_default.fbx") == null) {
                    var defaultModel = await KnownFolders.Objects3D.CreateFileAsync("molecule_default.fbx");
                    await FileIO.WriteBytesAsync(defaultModel, m_defaultModelData);
                }

                var allModels = await KnownFolders.Objects3D.GetFilesAsync();

                m_currentPathTMP.text = KnownFolders.Objects3D.Path.Replace(@"\", "/");
                m_directoryFiles = allModels.Where(f => f.FileType.ToLower() == ".fbx").Select(f => f.Path).ToArray();
                loaded = true;
            });
#else
            var userPath = new DirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)).Parent.Parent.FullName;
            var objects3DPath = Path.Combine(userPath, "3D Objects");

            Directory.CreateDirectory(objects3DPath);

            if (!File.Exists(objects3DPath + "/molecule_default.fbx"))
                File.WriteAllBytes(objects3DPath + "/molecule_default.fbx", m_defaultModelData);

            m_currentPathTMP.text = objects3DPath.Replace(@"\", "/");
            m_directoryFiles = new DirectoryInfo(objects3DPath).GetFiles().Where(f => f.Extension.ToLower() == ".fbx").Select(f => f.FullName).ToArray();
            loaded = true;
#endif

            while (!loaded) 
                yield return null;
        }

        IEnumerator ListModels() {
            yield return LoadModels();

            if (m_directoryFiles.Length == 0)
                yield break;

            for (var i = 0; i < m_directoryFiles.Length; i++) {
                var button = Instantiate(m_textButtonPrefab, m_content).GetComponent<Interactable>();
                var tmp = button.transform.Find("IconAndText/TextMeshPro").GetComponent<TextMeshPro>();
                var filePath = m_directoryFiles[i];

                tmp.text = Path.GetFileName(m_directoryFiles[i]);
                button.OnClick.AddListener(() => LoadModel(filePath));
            }

            m_scrollingCollection.UpdateCollection();
        }

        static void LoadModel(string modelPath) {
#if ENABLE_WINMD_SUPPORT
            Task.Run(async () => {
                if (await StorageFile.GetFileFromPathAsync(modelPath) != null)
                    LoadModel(modelPath, Instantiate(Instance.m_modelComponentPrefab));
            });
#else
            if (!File.Exists(modelPath))
                return;

            LoadModel(modelPath, Instantiate(Instance.m_modelComponentPrefab));
#endif
        }

        static void LoadModel(string modelPath, GameObject wrapperGameObject) {
            using (var assetLoaderAsync = new AssetLoaderAsync()) {
                var assetLoaderOptions = AssetLoaderOptions.CreateInstance();

                assetLoaderOptions.UseLegacyAnimations = false;
                assetLoaderOptions.AnimatorController = Instance.m_runtimeAnimatorController;

                var thread = assetLoaderAsync.LoadFromFile(modelPath, assetLoaderOptions, null, delegate (GameObject loadedModel) {
                    loadedModel.name = Path.GetFileNameWithoutExtension(modelPath);
                    loadedModel.transform.SetParent(wrapperGameObject.transform);
                    wrapperGameObject.transform.SetParent(Instance.m_modelLoadArea);

                    var c = loadedModel.GetComponentsInChildren<Renderer>();

                    foreach (var x in c)
                        x.gameObject.AddComponent<BoxCollider>();

                    var x1 = wrapperGameObject.GetComponent<Microsoft.MixedReality.Toolkit.Experimental.UI.BoundsControl.BoundsControl>();
                    var x2 = wrapperGameObject.GetComponent<ManipulationHandler>();

                    x1.BoundsOverride = c.FirstOrDefault().GetComponent<BoxCollider>();
                    x1.Awake();
                    x2.Awake();

                    wrapperGameObject.transform.localScale = new Vector3(.1f, .1f, .1f);
                });
            }
        }

#if UNITY_EDITOR
        [Header("Editor")]
        [SerializeField] private GameObject m_defaultTestModel;

        void OnValidate() {
            if (m_defaultTestModel && (null != m_defaultModelData || m_defaultModelData.Length == 0)) {
                var modelPath = AssetDatabase.GetAssetPath(m_defaultTestModel);
                m_defaultModelData = File.ReadAllBytes(modelPath);
            }
        }
#endif
    }
}

我正在使用Trilib加载3D模型的应用程序。目前,该应用程序可在Unity中运行,并且PC 3D模型文件夹中的所有fbx文件都可通过远程...

hololens
1个回答
0
投票

尽管可以通过StorageFile类获得图片库中文件的引用,但不能通过路径直接访问库文件夹中的文件。

© www.soinside.com 2019 - 2024. All rights reserved.