Hledal jsem SDK, která má přístup k vnitřní složky (3D model složku) HoloLens a vložte jej do běžící aplikace a vyzkoušeli jsme spoustu odkazů bezvýsledně. Může nám někdo pomoci vyřešit tento problém?
Vaše otázka je velmi široká, ale abych byl upřímný UWP je složité téma. Píšu to na telefonu, ale přesto doufám, že vám to pomůže začít.
Za prvé: Hololens používá UWP
.
Děláš soubor IO v UWP
aplikace, které potřebujete použít speciální c# API, které funguje pouze v asynchronním! Takže, seznámit se s tímto konceptem a klíčová slova async
, await
a Task
předtím, než začnete!
Dále upozorňujeme, že většina z Jednoty API může být použit pouze na Jednotu, hlavní vlákno! Proto budete potřebovat specializované třídy, která umožňuje přijímat asynchronní Action
s a odesílat je do další Jednoty, hlavní vlákno Update
volání přes ConcurrentQueue
jako např.
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();
}
}
}
Teď to řekl, jste pravděpodobně hledáte Windows.Storage.KnownFolders.Objects3D
což je Windows.Storage.StorageFolder
.
Zde budete používat GetFileAsync
s cílem získat Windows.Storage.StorageFile
.
Pak můžete použít Windows.Storage.FileIO.ReadBufferAsync
aby číst obsah tohoto souboru do IBuffer
.
A konečně, můžete použít ToArray
s cílem získat suroviny byte[]
.
Po tom všem, co musíte odeslat výsledek zpět do Jednoty hlavní vlákno, aby bylo možné ji používat tam (nebo pokračovat v procesu importu v další asynchronní způsob).
Můžete zkusit použít něco jako
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));
}
}
Co budete pak dělat se vrátil byte[]
je jen na vás! Existuje mnoho loader implementace a knihoven on-line pro různé typy souborů.
Další čtení: