我正在使用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文件都可通过远程...
尽管可以通过StorageFile类获得图片库中文件的引用,但不能通过路径直接访问库文件夹中的文件。