トップ > 【Unity】HttpClientをシングルトン化したHttpClientManagerの実装方法について紹介します!
更新日 2024/3/1

【Unity】HttpClientをシングルトン化したHttpClientManagerの実装方法について紹介します!

このページではHttpClientをシングルトン化したHttpClientManagerクラスの紹介をします。HttpClientはアプリケーションで1回だけインスタンス化して再利用しなければならないので複数回インスタンス化されないようにシングルトンを利用してHttpClientManagerクラスを実装します。

http client manager thumbnail

Unityのシングルトンは分かったけど実際にどう使われるのかな?

HttpClientをシングルトン化する簡単な例で説明しますね。

HttpClientManagerの実装

HttpClientをシングルトン化したHttpClientManagerを実装します。

SingletonMonoBehaviourを継承する

SingletonMonoBehaviourを継承してHttpClientManagerを実装します。

public class HttpClientManager : SingletonMonoBehaviour<HttpClientManager>

SingletonMonoBehaviourは以下のページを参照してください。

singleton
【Unity】シングルトンパターンを実装する方法を紹介します!2024/3/1

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を常駐化します。

HttpClientManager

詳細はUnityのゲームオブジェクトを常駐化させる方法を参照してください。

resident_object
【Unity】ゲームオブジェクトを常駐化させるための方法を紹介します!2024/3/1

常駐化の方法は以前に学んだね!

画像データの読み込み

ウェブ上から非同期で画像データを読み込みます。GetByteArrayAsync関数でネットワーク上のファイルのバイト配列を取得します。

var task = Task.Run(() => HttpClientManager.Instance.GetByteArrayAsync(uri));

バイト配列からのテクスチャ作成方法はUnityでリソースを読み込む方法を参照して下さい。

resource
【Unity】スクリプトからテクスチャーなどのリソースを読み込む様々な方法を紹介します!2024/2/9

ネットワーク上のリソースを読み込み方法も学んだね!

確認用スクリプトのソースコード

今回作成した確認用スクリプトのソースコードです。適当なゲームオブジェクトに追加して下さい。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を実行してゲームビューにテクスチャーが表示されるのを確認します。

HttpClientManager_test

最後にUnityを実行して確認して下さいね。

まとめ

今回の記事のまとめだよ!

・シングルトンは常駐させる!
・シングルトンで隠蔽すると分業しやすい!

シングルトンのおさらいみたいになっちゃったね!

SingletonMonoBehaviourを継承して実践的なシングルトンクラスを作成できました。同じ様にオリジナルのシングルトンクラスを作ってみて下さいね。

関連ページ

こちらのページも合わせてご覧下さい!

singleton
【Unity】シングルトンパターンを実装する方法を紹介します!2024/3/1
resident_object
【Unity】ゲームオブジェクトを常駐化させるための方法を紹介します!2024/3/1
resource
【Unity】スクリプトからテクスチャーなどのリソースを読み込む様々な方法を紹介します!2024/2/9
event_init
【Unity】MonoBehaviourの初期化イベントについて考察します!2024/2/12
【Unity】VOICEVOXエンジンでリアルタイム音声合成する方法を紹介します!2023/4/17

Copyright ©2022 - 2024 うにぉらぼ