133 lines
3.8 KiB
C#
133 lines
3.8 KiB
C#
#if UNITY_WEBGL
|
||
using System;
|
||
using System.Runtime.InteropServices;
|
||
using System.Threading;
|
||
using System.Threading.Tasks;
|
||
using UnityEngine;
|
||
using XericLibrary.Runtime.MacroLibrary;
|
||
using XericLibrary.Runtime.Type;
|
||
using XericLibrary.Runtime.Type.Base;
|
||
|
||
namespace XericLibrary.Runtime.MacroLibrary
|
||
{
|
||
/// <summary>
|
||
/// Web 平台文件句柄。
|
||
/// </summary>
|
||
public class WebGLHandle : CrossPlatformFileHandle
|
||
{
|
||
public override string PlatformName => "WebGL";
|
||
public static WebGLHandle handle = new WebGLHandle();
|
||
public static float GlobalTimeout = 10f;
|
||
public float Timeout = -1f;
|
||
|
||
private float timeout => Timeout >= 0 ? Timeout : GlobalTimeout;
|
||
|
||
public WebGLHandle() : base(RuntimePlatform.WebGLPlayer)
|
||
{
|
||
if (handle == null)
|
||
handle = this;
|
||
}
|
||
|
||
[DllImport("__Internal")]
|
||
private static extern void Download(string base64str, string fileName);
|
||
|
||
//[DllImport("__Internal")]
|
||
//private static extern void OpenFileDialog(string gameObjectName, string callbackMethodName);
|
||
|
||
//[DllImport("__Internal")]
|
||
//private static extern void OpenFileDialogBinary(string gameObjectName, string callbackMethodName);
|
||
|
||
public override bool ReadTextFromFile(string absolutePathname, out string content)
|
||
{
|
||
var waitFlag = false;
|
||
var result = string.Empty;
|
||
|
||
SingleMonoBase<WebFileLoader>.GlobalInstance.DirectlyLoadFile(absolutePathname, s => result = s, s =>
|
||
{
|
||
XericLogger.CCError($"WebGl文件同步加载失败:{s}");
|
||
}, () => { waitFlag = true; });
|
||
|
||
// 等待文件加载完成
|
||
while (!waitFlag)
|
||
{
|
||
// 让出控制权,避免完全阻塞
|
||
Debug.LogWarning("不建议在WebGl端使用同步文件读取方式,当前已让渡主线程控制权");
|
||
Thread.Sleep(0);
|
||
}
|
||
content = result;
|
||
return waitFlag;
|
||
}
|
||
|
||
public override bool WriteTextIntoFile(string absolutePathname, string content)
|
||
{
|
||
try
|
||
{
|
||
Download(content, absolutePathname);
|
||
return true;
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
Debug.LogError($"无法下载文件{absolutePathname}:{e.Message}");
|
||
return false;
|
||
}
|
||
}
|
||
|
||
public override async Task<bool> AsyncReadTextFromFile(string absolutePathname, Action<string> complete, Action<string> loadError)
|
||
{
|
||
var waitFlag = false;
|
||
var result = false;
|
||
SingleMonoBase<WebFileLoader>.GlobalInstance.DirectlyLoadFile(absolutePathname,
|
||
s =>
|
||
{
|
||
result = true;
|
||
complete?.Invoke(s);
|
||
}, loadError, () => { waitFlag = true; });
|
||
await MacroAsync.WaitUntil(() => waitFlag, () => "WebGl文件读取失败", timeout);
|
||
return result;
|
||
}
|
||
|
||
public override async Task<bool> AsyncWriteTextIntoFile(string absolutePathname, string content, Action complete, Action<string> loadError)
|
||
{
|
||
await Task.Yield();
|
||
if (WriteTextIntoFile(absolutePathname, content))
|
||
{
|
||
complete?.Invoke();
|
||
}
|
||
else
|
||
{
|
||
loadError?.Invoke("WebGL文件写入失败");
|
||
XericLogger.CCError("WebGL文件写入失败");
|
||
}
|
||
await Task.CompletedTask;
|
||
return false;
|
||
}
|
||
|
||
public override string CombinePath(string pathA, string pathB)
|
||
{
|
||
try
|
||
{
|
||
if (!pathA.EndsWith("/")) // 确保路径以斜杠结尾
|
||
pathA += "/";
|
||
var uri = new Uri(new Uri(pathA, UriKind.Absolute), new Uri(pathB, UriKind.RelativeOrAbsolute));
|
||
/* 不能使用uri自己的
|
||
* 比如 uri.IsAbsoluteUri ? uri.AbsolutePath : uri.LocalPath;
|
||
* 在这种情况时:
|
||
* http://192.168.0.39:8080/DGJ/StreamingAssets/ + UriConfig.json
|
||
* 结果是 => /DGJ/StreamingAssets/UriConfig.json 用是AbsolutePath
|
||
* 所以要么直接A + B
|
||
* 要么直接Tostring。
|
||
*/
|
||
Debug.Log($"Web路径拼接处理结果浏览:{pathA}\n{pathB}\n{uri}\n");
|
||
return uri.ToString();
|
||
}
|
||
catch (UriFormatException ex)
|
||
{
|
||
// 处理URI格式错误
|
||
XericLogger.CCError($"Web路径拼接失败: {ex.Message}");
|
||
return string.Empty;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
#endif
|