@shienaの技術ブログ

Unity2018.3で以下の要件を満たす方法をUniRxを使って書いてみた。

  • 定期的にWebAPIにリクエストしたい
  • 一度リクエストしたらN秒間はリクエストしない
  • 同時に2本以上リクエストしない(前のリクエストが遅いときは終わるまで次のリクエストを行わない)
var requestSpan = TimeSpan.FromSeconds(5);  
var requestTimout = TimeSpan.FromSeconds(3);  

var isRequesting = false;  
this.UpdateAsObservable()  
    .Where(_ => !isRequesting)  
    .ThrottleFirst(requestSpan)  
    .Do(_ => isRequesting = true)  
    .SelectMany(_ =>  
    {  
        var request = UnityWebRequest.Get(Uri);  
        return request.SendWebRequest()  
            .AsAsyncOperationObservable()  
            .Finally(() =>   
            {  
                request.Dispose();  
                isRequesting = false;  
            })  
            .Timeout(requestTimout)  
            .Where(aoob => aoob.webRequest.responseCode == 200)  
            .CatchIgnore();  
    })  
    .Subscribe(  
        success => { Debug.Log(success.webRequest.downloadHandler.text); },  
        Debug.LogException  
    );  

タイムアウトの設定はUnityWebRequest.timeoutでも可能だがintで秒単位なので、ミリ秒まで扱えるObservable.Timeoutの方が柔軟性があると思う。ただし、UnityWebRequest.DisposeもしくはUnityWebRequest.Abortを忘れるとコネクションが切れずに前回のリクエストの続きになってしまうので注意が必要。

このログへのコメント

コメントはありません