tuyoogame / YooAsset

unity3d resources management system
https://www.yooasset.com/
Apache License 2.0
2.38k stars 467 forks source link

多个package时,进行Package.UpdatePackageVersionAsync会产生第二个package调用时直接使用FallbackURL #156

Closed ConnorSin closed 12 months ago

ConnorSin commented 1 year ago

查看了源码发现下面文件因为RequestCount是static的,第一包请求时调用GetPackageVersionRequestURL返回了正确的地址,轮到第二个包请求时就会直接返回了FallbackURL

`

using System.IO;

namespace YooAsset { internal class QueryRemotePackageVersionOperation : AsyncOperationBase { private enum ESteps { None, DownloadPackageVersion, Done, }

    private static int RequestCount = 0;
    private readonly IRemoteServices _remoteServices;
    private readonly string _packageName;
    private readonly bool _appendTimeTicks;
    private readonly int _timeout;
    private UnityWebDataRequester _downloader;
    private ESteps _steps = ESteps.None;

    /// <summary>
    /// 包裹版本
    /// </summary>
    public string PackageVersion { private set; get; }

    public QueryRemotePackageVersionOperation(IRemoteServices remoteServices, string packageName, bool appendTimeTicks, int timeout)
    {
        _remoteServices = remoteServices;
        _packageName = packageName;
        _appendTimeTicks = appendTimeTicks;
        _timeout = timeout;
    }
    internal override void Start()
    {
        RequestCount++;
        _steps = ESteps.DownloadPackageVersion;
    }
    internal override void Update()
    {
        if (_steps == ESteps.None || _steps == ESteps.Done)
            return;

        if (_steps == ESteps.DownloadPackageVersion)
        {
            if (_downloader == null)
            {
                string fileName = YooAssetSettingsData.GetPackageVersionFileName(_packageName);
                string webURL = GetPackageVersionRequestURL(fileName);
                YooLogger.Log($"Beginning to request package version : {webURL}");
                _downloader = new UnityWebDataRequester();
                _downloader.SendRequest(webURL, _timeout);
            }

            Progress = _downloader.Progress();
            if (_downloader.IsDone() == false)
                return;

            if (_downloader.HasError())
            {
                _steps = ESteps.Done;
                Status = EOperationStatus.Failed;
                Error = _downloader.GetError();
            }
            else
            {
                PackageVersion = _downloader.GetText();
                if (string.IsNullOrEmpty(PackageVersion))
                {
                    _steps = ESteps.Done;
                    Status = EOperationStatus.Failed;
                    Error = $"Remote package version is empty : {_downloader.URL}";
                }
                else
                {
                    _steps = ESteps.Done;
                    Status = EOperationStatus.Succeed;
                }
            }

            _downloader.Dispose();
        }
    }

    private string GetPackageVersionRequestURL(string fileName)
    {
        string url;

        // 轮流返回请求地址
        if (RequestCount % 2 == 0)
            url = _remoteServices.GetRemoteFallbackURL(fileName);
        else
            url = _remoteServices.GetRemoteMainURL(fileName);

        // 在URL末尾添加时间戳
        if (_appendTimeTicks)
            return $"{url}?{System.DateTime.UtcNow.Ticks}";
        else
            return url;
    }
}

}

`

sunny352 commented 1 year ago

本质上应该是图省事没有做重试逻辑导致的,这种写法有四处,需要在这4个地方添加重试

gmhevinci commented 12 months ago

fixed https://github.com/tuyoogame/YooAsset/commit/49b188964c66e962d7cf6db20ec1cd1dcca603e1