[Unity] WWWリクエストのタイムアウトを実装する

UnityのWWWクラスには元々タイムアウトの機能が実装されていません。
そこで、何とかして簡単にタイムアウト機能を実装して使えないかどうか考えました。

あまり良い方法が思いつきませんでしたが、以下のようにMonoBehabiourを継承したクラスを実装し、GameObjectにアタッチして使えばひとまずは実現できます。

using UnityEngine;
using System.Collections;

public class ConnectionManager : MonoBehaviour {
    public float timeOut = 10;  // タイムアウト時間
    [HideInInspector]
    public WWW result;  // 結果
    [HideInInspector]
    public bool isTimeOut = false;

    // タイムアウトを考慮したリクエスト
    public IEnumerator Request(string url) {
        var www = new WWW(url);
        var endTime = Time.realtimeSinceStartup + timeOut;

        while ( !www.isDone || Time.realtimeSinceStartup < endTime ) {
            yield return 0;
        }

        isTimeOut = !www.isDone;
        result = www;
    }
}

上記スクリプトを任意のGameObjectにアタッチすると使えるようになります。
実際の使い方は以下のようになります。

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour {
    void Start () {
        StartCoroutine(TestConnect("http://○○.com"));
    }

    IEnumerator TestConnect(string url) {
        var connection = GameObject.FindObjectOfType<ConnectionManager>();
        yield return connection.Request(url);

        if ( connection.isTimeOut ) {
            Debug.Log("TimeOut!");
        } else {
            Debug.Log("NotTimeOut!");
        }
    }
}

タイムアウトになったときにはConnectionManager.isTimeOutがtrueとなります。
WWWにてサーバにリクエストを出すときは毎回ConnectionManager.Request()メソッドを呼び出すようにすればOKです。

理想を言うとWWWクラスを継承したいところですが、出来ないため上記のような方法を取るようにしています。
WWWクラスを直接利用せず、通信の管轄クラスを実装して使うようにするのが無難と言えそうです。