Как получить доступ к файлам данных приложения в мета-квесте?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как получить доступ к файлам данных приложения в мета-квесте?

Сообщение Anonymous »

Я создаю игру, используя Unity, и в игре я анализирую MIDI-файлы и использую данные для создания уровня. моя проблема в том, что он работает как на единстве, так и на сборке Windows. Однако, когда я строю для квеста, это не работает.
Изменяется ли путь при сборке для мета-квеста? или это проблема с разрешением?
Я получаю к нему доступ так: помещаю все свои MIDI-файлы в папку «StreamingAssets» и пытаюсь получить к ним доступ оттуда. Моя логика заключается в том, чтобы прочитать заголовки MIDI-файлов, добавить их в меню внутри игры, и когда игрок нажимает на один из них, он читает его и создает для них уровень, когда он нажимает кнопку воспроизведения.
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using TMPro;
using UnityEngine.UI;
using UnityEngine.Android; // For permission handling on Android
using UnityEngine.Networking; // For reading from StreamingAssets on Android

public class MidiFileLoader : MonoBehaviour
{
public List midiFilePaths = new List(); // Store all MIDI file paths
public GameObject buttonPrefab; // Assign a UI Button prefab with a Text component
public Transform buttonContainer; // A parent object in the UI where buttons will be placed

void Start()
{
// Request permission for external storage on Android
if (Application.platform == RuntimePlatform.Android)
{
RequestStoragePermissions();
}

StartCoroutine(LoadMidiFiles()); // Use coroutine for loading MIDI files
}

// Coroutine to load MIDI files from StreamingAssets
private IEnumerator LoadMidiFiles()
{
string midiFilesFolder = Path.Combine(Application.streamingAssetsPath, "MidiFiles");

// Load files from "Piano" and "Drums" subfolders
string pianoFolder = Path.Combine(midiFilesFolder, "Piano");
string drumsFolder = Path.Combine(midiFilesFolder, "Drums");

if (!MidiReader.instance.isDrums)
{
yield return StartCoroutine(LoadMidiFilesFromFolder(pianoFolder));
}
else
{
yield return StartCoroutine(LoadMidiFilesFromFolder(drumsFolder));
}

PopulateMenu();
}

// Coroutine to load MIDI files from a folder
private IEnumerator LoadMidiFilesFromFolder(string folderPath)
{
// On Android, use UnityWebRequest to load files from StreamingAssets
string url = Path.Combine(Application.streamingAssetsPath, folderPath);

if (Application.platform == RuntimePlatform.Android)
{
UnityWebRequest request = UnityWebRequest.Get(url);
yield return request.SendWebRequest();

if (request.result == UnityWebRequest.Result.Success)
{
string[] filePaths = request.downloadHandler.text.Split('\n'); // Parse file paths
foreach (string path in filePaths)
{
if (path.EndsWith(".mid"))
{
midiFilePaths.Add(path);
}
}
}
else
{
Debug.LogError("Failed to load files from: " + url);
}
}
else
{
// For platforms other than Android, use standard file system access
if (Directory.Exists(folderPath))
{
string[] files = Directory.GetFiles(folderPath, "*.mid");
midiFilePaths.AddRange(files);
}
}
}

// This method will populate the menu with the MIDI file paths
void PopulateMenu()
{
for (int i = 0; i < midiFilePaths.Count; i++)
{
string path = midiFilePaths;

// Instantiate the button inside the buttonContainer
GameObject newButton = Instantiate(buttonPrefab, buttonContainer);

// Set the button text to the MIDI file name
newButton.GetComponentInChildren().text = Path.GetFileNameWithoutExtension(path);

// Add a listener to the button to load the selected file when clicked
Button buttonComponent = newButton.GetComponent();
buttonComponent.onClick.AddListener(() =>
{
Debug.Log("Button clicked for: " + path);
MidiReader.instance.StartReading(path);
});
}
}

// Request external storage permissions on Android
private void RequestStoragePermissions()
{
if (!Permission.HasUserAuthorizedPermission(Permission.ExternalStorageRead))
{
Permission.RequestUserPermission(Permission.ExternalStorageRead);
}

// Optional: Check for write permission if needed
if (!Permission.HasUserAuthorizedPermission(Permission.ExternalStorageWrite))
{
Permission.RequestUserPermission(Permission.ExternalStorageWrite);
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/790 ... meta-quest
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Владение устройством в мета-квесте 2 и квесте 3
    Anonymous » » в форуме Android
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Как получить доступ к файлам данных приложения в мета-квесте?
    Anonymous » » в форуме C#
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Как получить доступ к файлам данных приложения в мета-квесте?
    Anonymous » » в форуме C#
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Как получить доступ к файлам данных приложения в мета-квесте?
    Anonymous » » в форуме C#
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Скрыть пространственную точку якоря на квесте контроллера 3
    Anonymous » » в форуме C#
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»