update extension sample

增加微信小游戏文件系统范例
pull/326/head
何冠峰 2024-07-04 22:56:45 +08:00
parent 02d70a476d
commit db8d09d0d6
3 changed files with 148 additions and 1 deletions

View File

@ -0,0 +1,135 @@
#if UNITY_WECHAT_GAME
using UnityEngine;
using UnityEngine.Networking;
using YooAsset;
using WeChatWASM;
/// <summary>
/// 微信小游戏文件系统扩展
/// 参考https://wechat-miniprogram.github.io/minigame-unity-webgl-transform/Design/UsingAssetBundle.html
/// </summary>
internal class WechatFileSystem : DefaultWebFileSystem
{
/// <summary>
/// 资源文件加载
/// </summary>
public override FSLoadBundleOperation LoadBundleFile(PackageBundle bundle)
{
var operation = new WechatLoadBundleOperation(this, bundle);
OperationSystem.StartOperation(PackageName, operation);
return operation;
}
/// <summary>
/// 资源文件卸载
/// </summary>
public override void UnloadBundleFile(PackageBundle bundle, object result)
{
AssetBundle assetBundle = result as AssetBundle;
if (assetBundle != null)
assetBundle.WXUnload(true);
}
/// <summary>
/// 重写资源文件加载类
/// </summary>
internal class WechatLoadBundleOperation : FSLoadBundleOperation
{
private enum ESteps
{
None,
LoadBundleFile,
Done,
}
private readonly WechatFileSystem _fileSystem;
private readonly PackageBundle _bundle;
private UnityWebRequest _webRequest;
private ESteps _steps = ESteps.None;
internal WechatLoadBundleOperation(WechatFileSystem fileSystem, PackageBundle bundle)
{
_fileSystem = fileSystem;
_bundle = bundle;
}
internal override void InternalOnStart()
{
_steps = ESteps.LoadBundleFile;
}
internal override void InternalOnUpdate()
{
if (_steps == ESteps.None || _steps == ESteps.Done)
return;
if (_steps == ESteps.LoadBundleFile)
{
if (_webRequest == null)
{
string mainURL = _fileSystem.RemoteServices.GetRemoteMainURL(_bundle.FileName);
_webRequest = WXAssetBundle.GetAssetBundle(mainURL);
_webRequest.SendWebRequest();
}
DownloadProgress = _webRequest.downloadProgress;
DownloadedBytes = (long)_webRequest.downloadedBytes;
Progress = DownloadProgress;
if (_webRequest.isDone == false)
return;
if (CheckRequestResult())
{
_steps = ESteps.Done;
Result = (_webRequest.downloadHandler as DownloadHandlerWXAssetBundle).assetBundle;
Status = EOperationStatus.Succeed;
}
else
{
_steps = ESteps.Done;
Status = EOperationStatus.Failed;
}
}
}
public override void WaitForAsyncComplete()
{
if (IsDone == false)
{
_steps = ESteps.Done;
Status = EOperationStatus.Failed;
Error = "WebGL platform not support sync load method !";
UnityEngine.Debug.LogError(Error);
}
}
public override void AbortDownloadOperation()
{
}
private bool CheckRequestResult()
{
#if UNITY_2020_3_OR_NEWER
if (_webRequest.result != UnityWebRequest.Result.Success)
{
Error = _webRequest.error;
return false;
}
else
{
return true;
}
#else
if (_webRequest.isNetworkError || _webRequest.isHttpError)
{
Error = _webRequest.error;
return false;
}
else
{
return true;
}
#endif
}
}
}
#endif

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 97f01c24ae799f34393a4362f33a0e1f
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -2,7 +2,8 @@
"name": "YooAsset.RuntimeExtension", "name": "YooAsset.RuntimeExtension",
"rootNamespace": "", "rootNamespace": "",
"references": [ "references": [
"GUID:e34a5702dd353724aa315fb8011f08c3" "GUID:e34a5702dd353724aa315fb8011f08c3",
"GUID:5efd170ecd8084500bed5692932fe14e"
], ],
"includePlatforms": [], "includePlatforms": [],
"excludePlatforms": [], "excludePlatforms": [],