Am fost în căutarea pentru un SDK care pot accesa interne folder (model 3D folder) din HoloLens și încărcați-l într-o aplicație care rulează și am încercat o mulțime de link-uri la nici un rezultat. Poate cineva sa ne ajute rezolva această problemă?
Intrebarea ta este extrem de larg, dar pentru a fi sincer UWP este un subiect complicat. Scriu acest lucru pe telefonul meu, deși, dar sper că vă ajută noțiuni de bază.
Mai întâi de toate: Hololens foloseste UWP
.
Pentru a face fișierul IO în UWP
aplicațiile de care aveți nevoie pentru a utiliza un speciale c# API care funcționează numai asincron! Astfel încât să vă familiarizați cu acest concept și cuvinte cheie async
, await
și Task
înainte de a începe!
Mai rețineți că cele mai multe dintre Unitatea API poate fi folosit doar pe Unitatea principală fir! Prin urmare, veți avea nevoie de un dedicat de clasă, care permite de a primi asincron Action
s și expedierea acestora în următoarea Unitate firul principal Update
apel prin intermediul unui ConcurrentQueue
ca de exemplu
using System;
using System.Collections.Concurrent;
using UnityEngine;
public class MainThreadDispatcher : MonoBehaviour
{
private static MainThreadDispatcher _instance;
public static MainThreadDispatcher Instance
{
get
{
if (_instance) return _instance;
_instance = FindObjectOfType<MainThreadDispatcher>();
if (_instance) return _instance;
_instance = new GameObject(nameof(MainThreadDispatcher)).AddComponent<MainThreadDispatcher>();
return _instance;
}
}
private readonly ConcurrentQueue<Action> _actions = new ConcurrentQueue<Action>();
private void Awake()
{
if (_instance && _instance != this)
{
Destroy(gameObject);
return;
}
_instance = this;
DontDestroyOnLoad(gameObject);
}
public void DoInMainThread(Action action)
{
_actions.Enqueue(action);
}
private void Update()
{
while (_actions.TryDequeue(out var action))
{
action?.Invoke();
}
}
}
Acum, aceasta a spus că sunteți cel mai probabil, în căutarea pentru Windows.Storage.KnownFolders.Objects3D
care este o Windows.Storage.StorageFolder
.
Aici veți folosi GetFileAsync
în scopul de a obține un Windows.Storage.StorageFile
.
Apoi, utilizați Windows.Storage.FileIO.ReadBufferAsync
în scopul de a citi conținutul acestui fișier într-un IBuffer
.
Și, în sfârșit, puteți utiliza ToArray
în scopul de a obține prime byte[]
afară de asta.
După toate acestea trebuie să trimite rezultatul înapoi în Unitatea firul principal, în scopul de a fi capabil să-l folosească acolo (sau de a continua cu procesul de import într-un alt mod asincron).
Puteți încerca și de a folosi ceva de genul
using System;
using System.IO;
using System.Threading.Tasks;
#if WINDOWS_UWP // We only have these namespaces if on an UWP device
using Windows.Storage;
using System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBufferExtensions;
#endif
public static class Example
{
// Instead of directly returning byte[] you will need to use a callback
public static void GetFileContent(string filePath, Action<byte[]> onSuccess)
{
Task.Run(async () => await FileLoadingTask(filePath, onSuccess));
}
private static async Task FileLoadingTask(string filePath, Action<byte[]> onSuccess)
{
#if WINDOWS_UWP
// Get the 3D Objects folder
var folder = Windows.Storage.KnownFolders.Objects3D;
// get a file within it
var file = await folder.GetFileAsync(filePath);
// read the content into a buffer
var buffer = await Windows.Storage.FileIO.ReadBufferAsync(file);
// get a raw byte[]
var bytes = buffer.ToArray();
#else
// as a fallback and for testing in the Editor use he normal FileIO
var folderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "3D Objects");
var fullFilePath = Path.Combine(folderPath, filePath);
var bytes = await File.ReadAllBytesAsync(fullFilePath);
#endif
// finally dispatch the callback action into the Unity main thread
MainThreadDispatcher.Instance.DoInMainThread(() => onSuccess?.Invoke(bytes));
}
}
Ce te faci atunci cu a revenit byte[]
este de până la tine! Există multe loader implementări și biblioteci on-line pentru diferite tipuri de fișiere.
Lecturi suplimentare: