Files
AR-Menu/Library/PackageCache/org.khronos.unitygltf@6b55d14e19c1/Runtime/Scripts/Loader/UnityWebRequestLoader.cs
2025-11-30 08:35:03 +02:00

98 lines
2.7 KiB
C#

using System.IO;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Networking;
namespace UnityGLTF.Loader
{
public class UnityWebRequestLoader : IDataLoader
{
private string dir;
public UnityWebRequestLoader(string dir)
{
this.dir = dir;
}
#if UNITY_WEBREQUEST
public async Task<Stream> LoadStreamAsync(string relativeFilePath)
{
var path = Path.Combine(dir, relativeFilePath).Replace("\\","/");
if (File.Exists(path))
path = "file://" + Path.GetFullPath(path);
var request = UnityWebRequest.Get(path);
// request.downloadHandler = new DownloadStreamHandler(new byte[1024 * 1024]);
var asyncOperation = request.SendWebRequest();
while (!asyncOperation.isDone) {
await Task.Yield();
}
#if UNITY_2020_1_OR_NEWER
if (request.result != UnityWebRequest.Result.Success)
#else
if (request.isNetworkError || request.isHttpError)
#endif
{
Debug.LogError($"Error when loading {relativeFilePath} ({path}): {request.error}");
return null;
}
var results = request.downloadHandler.data;
var stream = new MemoryStream(results, 0, results.Length, false, true);
return stream;
}
#else
public async Task<Stream> LoadStreamAsync(string relativeFilePath)
{
await Task.CompletedTask;
throw new System.ApplicationException("The module com.unity.modules.unitywebrequest is required for this functionality. Please install it in your project.");
}
#endif
// TODO: figure out how to do this correctly in a streaming fashion.
// private class DownloadStreamHandler : DownloadHandlerScript
// {
// private ulong expectedTotalBytes = 0;
// private Stream stream;
// public Stream GetStream()
// {
// return stream;
// }
//
// public DownloadStreamHandler(byte[] buffer) : base(buffer)
// {
// stream = new MemoryStream(buffer, true);
// }
//
// protected override bool ReceiveData(byte[] data, int dataLength)
// {
// if(data == null || data.Length < 1)
// {
// Debug.Log("LoggingDownloadHandler :: ReceiveData - received a null/empty buffer");
// return false;
// }
//
// stream.Write(data, 0, dataLength);
// return true;
// }
//
// protected override byte[] GetData()
// {
// throw new System.NotSupportedException("This is a stream, can't get all bytes");
// }
//
// protected override void CompleteContent()
// {
// Debug.Log("LoggingDownloadHandler :: CompleteContent - DOWNLOAD COMPLETE!");
// }
//
// protected override void ReceiveContentLengthHeader(ulong contentLength)
// {
// Debug.Log(string.Format("LoggingDownloadHandler :: ReceiveContentLength - length {0}", contentLength));
// expectedTotalBytes = contentLength;
// stream.SetLength((long) contentLength);
// }
// }
}
}