Files
2026-06-26 22:41:39 +05:30

138 lines
4.2 KiB
C#

// Copyright 2019 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
using System;
using System.Collections;
using UnityEngine;
namespace Google.Play.AssetDelivery.Internal
{
internal class PlayAssetBundleRequestImpl : PlayAssetBundleRequest
{
internal readonly PlayAssetPackRequestImpl PackRequest;
private readonly AssetDeliveryUpdateHandler _updateHandler;
private AssetDeliveryStatus _loadingStatus;
private AssetDeliveryErrorCode _loadingError;
public PlayAssetBundleRequestImpl(PlayAssetPackRequestImpl packRequest,
AssetDeliveryUpdateHandler updateHandler)
{
PackRequest = packRequest;
_updateHandler = updateHandler;
_loadingStatus = AssetDeliveryStatus.Pending;
_loadingError = AssetDeliveryErrorCode.NoError;
PackRequest.Completed += OnPackRequestCompleted;
}
public override event Action<PlayAssetBundleRequest> Completed
{
add
{
if (IsDone)
{
value.Invoke(this);
return;
}
base.Completed += value;
}
remove { base.Completed -= value; }
}
public override float DownloadProgress
{
get { return PackRequest.DownloadProgress; }
}
public override AssetDeliveryStatus Status
{
get { return PackRequest.Status == AssetDeliveryStatus.Available ? _loadingStatus : PackRequest.Status; }
}
public override AssetDeliveryErrorCode Error
{
get { return PackRequest.Error == AssetDeliveryErrorCode.NoError ? _loadingError : PackRequest.Error; }
}
private void OnLoadingErrorOccurred(AssetDeliveryErrorCode errorCode)
{
if (IsDone)
{
return;
}
IsDone = true;
_loadingError = errorCode;
_loadingStatus = AssetDeliveryStatus.Failed;
AssetBundle = null;
InvokeCompletedEvent();
}
private void OnLoadingFinished(AssetBundle loadedAssetBundle)
{
if (IsDone)
{
return;
}
DownloadProgress = 1f;
AssetBundle = loadedAssetBundle;
_loadingStatus = AssetDeliveryStatus.Loaded;
IsDone = true;
InvokeCompletedEvent();
}
private void OnPackRequestCompleted(PlayAssetPackRequest packRequest)
{
packRequest.Completed -= OnPackRequestCompleted;
if (packRequest.Error == AssetDeliveryErrorCode.NoError)
{
StartLoadingAssetBundle();
}
else
{
IsDone = true;
InvokeCompletedEvent();
}
}
private void StartLoadingAssetBundle()
{
_updateHandler.StartCoroutine(CoLoadAssetBundle());
DownloadProgress = 1f;
_loadingStatus = AssetDeliveryStatus.Loading;
}
private IEnumerator CoLoadAssetBundle()
{
// Assume that the AssetBundle name equals the asset pack name.
var bundleCreateRequest = PackRequest.LoadAssetBundleAsync(PackRequest.AssetPackName);
yield return bundleCreateRequest;
if (bundleCreateRequest.assetBundle == null)
{
OnLoadingErrorOccurred(AssetDeliveryErrorCode.AssetBundleLoadingError);
yield break;
}
OnLoadingFinished(bundleCreateRequest.assetBundle);
}
public override void AttemptCancel()
{
PackRequest.AttemptCancel();
}
}
}