Hololens 3D nesne Klasöründeki dosyalara nasıl erişilir ve çalışma zamanında uygulamaya nasıl ulaşılır

0

Soru

Hololens'in dahili klasörüne (3D model klasörü) erişebilen ve onu çalışan bir uygulamaya yükleyebilen bir SDK arıyordum ve boşuna birçok bağlantı denedik. Herkes bu sorunun çözümünde bize yardımcı olabilir misiniz?

3d-model c# hololens internals
2021-11-24 06:35:33
1

En iyi cevabı

0

Sorunuz son derece geniştir, ancak dürüst olmak gerekirse UWP zor bir konudur. Bunu telefonuma yazıyorum ama umarım başlamanıza yardımcı olur.


Her şeyden önce: Hololens kullanır UWP.

Dosya GÇ yapmak için UWP uygulamalar yalnızca eşzamansız çalışan özel bir c # API kullanmanız gerekir! Bu yüzden bu konsepte ve anahtar kelimelere aşina olunasync, await veTask başlamadan önce!

Ayrıca, Unity'nin apı'sinin çoğunun yalnızca Unity ana iş parçacığında kullanılabileceğini unutmayın! Bu nedenle, eşzamansız almayı sağlayan özel bir sınıfa ihtiyacınız olacaktır Actions ve onları bir sonraki Birlik ana iş parçacığına gönder Update a üzerinden arama ConcurrentQueue örneğin gibi

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();
        }
    }
}

Şimdi bu büyük olasılıkla aradığınızı söylediWindows.Storage.KnownFolders.Objects3D hangisi birWindows.Storage.StorageFolder.

Burada kullanacaksınızGetFileAsync almak için birWindows.Storage.StorageFile.

Sonra kullanırsınWindows.Storage.FileIO.ReadBufferAsync bu dosyanın içeriğini bir dosyaya okumak içinIBuffer.

Ve son olarak kullanabilirsinizToArray ham almak için byte[] bunun dışında.

Tüm bunlardan sonra, sonucu orada kullanabilmek için Unity ana iş parçacığına geri göndermeniz gerekir (veya içe aktarma işlemine başka bir zaman uyumsuz şekilde devam edin).

Gibi bir şey deneyebilir ve kullanabilirsiniz

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));
    }
}

Sonra geri dönenlerle ne yaparsınız? byte[] size kalmış! Farklı dosya türleri için çevrimiçi olarak birçok yükleyici uygulaması ve kitaplığı vardır.


Daha fazla okuma:

2021-11-24 09:34:08

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................