【Unity】HttpClientをシングルトン化したHttpClientManagerの実装方法について紹介します!
このページではHttpClientをシングルトン化したHttpClientManagerクラスの紹介をします。HttpClientはアプリケーションで1回だけインスタンス化して再利用しなければならないので複数回インスタンス化されないようにシングルトンを利用してHttpClientManagerクラスを実装します。
Unityのシングルトンは分かったけど実際にどう使われるのかな?
HttpClientをシングルトン化する簡単な例で説明しますね。
HttpClientManagerの実装
HttpClientをシングルトン化したHttpClientManagerを実装します。
SingletonMonoBehaviourを継承する
SingletonMonoBehaviourを継承してHttpClientManagerを実装します。
public class HttpClientManager : SingletonMonoBehaviour<HttpClientManager>
SingletonMonoBehaviourは以下のページを参照してください。
Unityのシングルトンパターンは以前に学んだね!
AwakeでHttpClientをインスタンス化する
継承したSingletonMonoBehaviour.Awakeを非表示にして新しくAwakeメソッドを実装し直します。シングルトンの初期化をしているbase.Awakeを呼び出した後、HttpClientをインスタンス化します。
new void Awake()
{
base.Awake();
client = new HttpClient();
}
base.AwakeはSingletonMonoBehaviour.Awakeを呼び出してるね!
HttpClientの機能を提供するメソッドを実装する
HttpClientの機能をHttpClientManagerに委譲していきます。GetByteArrayAsyncメソッドを委譲する例は以下の通りです。
public Task<byte[]> GetByteArrayAsync(string requestUri)
=> client.GetByteArrayAsync(requestUri);
HttpClientの機能をHttpClientManagerに実装するんだね!
HttpClientManagerのソースコード
今回作成したHttpClientManagerの全ソースコードです。
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
public class HttpClientManager : SingletonMonoBehaviour<HttpClientManager>
{
private HttpClient client;
new void Awake()
{
base.Awake();
client = new HttpClient();
}
public Task<HttpResponseMessage> GetAsync(string requestUri)
=> client.GetAsync(requestUri);
public Task<byte[]> GetByteArrayAsync(string requestUri)
=> client.GetByteArrayAsync(requestUri);
public Task<Stream> GetStreamAsync(string requestUri)
=> client.GetStreamAsync(requestUri);
public Task<string> GetStringAsync(string requestUri)
=> client.GetStringAsync(requestUri);
public Task<HttpResponseMessage> PostAsync(string requestUri, HttpContent content = null)
=> client.PostAsync(requestUri, content);
public Task<HttpResponseMessage> SendAsync(HttpRequestMessage request)
=> client.SendAsync(request);
}
ソースコードはGitHubにアップしてありますのでご利用下さい。
code-examples/unity/HttpClientManager.csこんな感じで実装するのかー。
HttpClientをシングルトンクラスで隠蔽すると別の作業者がHttpClientのことをあまり知らなくても簡単に使えたり、仕様変更にも強くなったりするよ。分業するときのコツだね。
Unityに組み込んで動作確認する
HttpClientManagerを利用してウェブ上の画像をUnity上で表示するサンプルプログラムを作ってみましょう。
HttpClientManagerを常駐する
HttpClientManagerを常駐化します。
詳細はUnityのゲームオブジェクトを常駐化させる方法を参照してください。
常駐化の方法は以前に学んだね!
画像データの読み込み
ウェブ上から非同期で画像データを読み込みます。GetByteArrayAsync関数でネットワーク上のファイルのバイト配列を取得します。
var task = Task.Run(() => HttpClientManager.Instance.GetByteArrayAsync(uri));
バイト配列からのテクスチャ作成方法はUnityでリソースを読み込む方法を参照して下さい。
ネットワーク上のリソースを読み込み方法も学んだね!
確認用スクリプトのソースコード
今回作成した確認用スクリプトのソースコードです。適当なゲームオブジェクトに追加して下さい。OnGUIのGUI.DrawTexture関数でテクスチャを描画しています。
using System.Threading.Tasks;
using UnityEngine;
public class TestScript : MonoBehaviour
{
Texture2D texture;
void Start()
{
string uri = "https://unixo-lab.com/images/profile.png";
var task = Task.Run(() => HttpClientManager.Instance.GetByteArrayAsync(uri));
task.Wait();
var data = task.Result;
texture = new Texture2D(1, 1);
texture.LoadImage(data);
texture.Apply();
}
void OnGUI()
{
GUI.DrawTexture(new Rect(0, 0, 100, 100), texture);
}
}
Startでテクスチャーを作成してOnGUIで描画してるね!
動作確認
Unityを実行してゲームビューにテクスチャーが表示されるのを確認します。
最後にUnityを実行して確認して下さいね。
まとめ
今回の記事のまとめだよ!
・シングルトンは常駐させる! ・シングルトンで隠蔽すると分業しやすい! | ||
シングルトンのおさらいみたいになっちゃったね!
SingletonMonoBehaviourを継承して実践的なシングルトンクラスを作成できました。同じ様にオリジナルのシングルトンクラスを作ってみて下さいね。
関連ページ
こちらのページも合わせてご覧下さい!