UnityWebRequestで逐次受信を実現する方法

2025/01/18に公開

UnityWebRequestで逐次受信を実現する方法

初めてゲームやアプリ開発を始めると、「ネットワークからデータを受け取る」場面が頻繁に出てきます。しかし、通常のUnityWebRequestやDownloadHandlerBufferでは、サーバから送られてきたデータをまとめて受信する形が多く、「リアルタイムで途中経過を処理するのは難しい…」と感じる方も多いのではないでしょうか。

実は、UnityWebRequest が提供している DownloadHandlerScript を活用すれば、データを小分け(チャンク)で受け取りつつリアルタイムに処理することが可能です。この記事では、その問題点と解決策を具体的に解説し、あなたの開発をよりスムーズに進めるためのヒントをお伝えします。

https://zenn.dev/ryuryu_game/books/fd28de9d8e963a

なぜリアルタイムのデータ受信が必要?(問題)

一括受信のデメリット

  • 通常の DownloadHandlerBuffer を使うと、通信が完了するまでまとめてデータを受け取ります。
  • 大量データを扱う場合は、完了までユーザーに何も見せられない、UIが更新されないなどの問題が生じやすいです。

リアルタイム処理が欲しいシーン

  • 大量ログの逐次取得: ゲームサーバから常時送られるステータスをリアルタイムに解析したい。
  • 部分的なメッセージやストリーミング: チャットのように、到着したメッセージをそのまま表示したい。
  • OpenAIや一部のWebサービス: Chunked Transferを利用して途中経過を返すため、それに合わせて逐次処理したいケースがある。

DownloadHandlerScriptによるリアルタイム処理(解決)

使い方の概要

  1. DownloadHandlerScriptの継承クラスを作る
    • DownloadHandlerScriptReceiveDataCompleteContent などをオーバーライドし、チャンクが届くたびに好きな処理を挟めます。
  2. UnityWebRequestにセットする
    • request.downloadHandler = new MyDownloadHandlerScript(); という形でアサイン。
  3. サーバ側の応答形式を確認
    • “chunked transfer encoding” でデータが流れてくるかどうか、あるいはストリーミング対応しているかにより、リアルタイムで処理できるかが左右されます。

簡易サンプル

using UnityEngine;
using UnityEngine.Networking;

public class ChunkedDownloader : MonoBehaviour
{
    private void Start()
    {
        // 例: Start時にダウンロードを開始
        StartCoroutine(DownloadInChunks("https://example.com/api/stream"));
    }

    private System.Collections.IEnumerator DownloadInChunks(string url)
    {
        using (UnityWebRequest request = new UnityWebRequest(url, "GET"))
        {
            request.downloadHandler = new MyDownloadHandler();
            yield return request.SendWebRequest();

            if (request.result == UnityWebRequest.Result.ProtocolError ||
                request.result == UnityWebRequest.Result.ConnectionError)
            {
                Debug.LogError("Error: " + request.error);
            }
            else
            {
                Debug.Log("Complete content received!");
            }
        }
    }
}

public class MyDownloadHandler : DownloadHandlerScript
{
    protected override bool ReceiveData(byte[] data, int dataLength)
    {
        if (data == null || dataLength == 0) return true;

        // ここで部分的に受け取ったdataを文字列化
        string chunk = System.Text.Encoding.UTF8.GetString(data, 0, dataLength);
        Debug.Log("[Chunk] " + chunk);

        return true; // 続行
    }

    protected override void CompleteContent()
    {
        // 最後に呼ばれる
        Debug.Log("All content has been received.");
        base.CompleteContent();
    }
}
  • ReceiveData がチャンクごとに呼び出されるため、サーバから小分けにデータが送信されれば、そのたびにログ出力やUI更新を行えます。
  • CompleteContent で最後の仕上げをすると、通信終了後の後処理が明確。

実運用のポイント

  • 誤検知や誤動作を考慮: 満員電車のように混雑した状態…ではなく、ネットワークが不安定な環境を想定したエラー処理を入れておきましょう。
  • サーバ設定: HTTPヘッダーが chunked transfer やストリーミングをサポートしているか事前に確認しないと、一括レスポンスになることもあります。
  • リアルタイム性: Chunkが届くタイミングはサーバ次第ですが、通常の一括ダウンロードに比べると心理的に「リアルタイム処理」を感じられます。

大量データや進捗を可視化したいケースに有効

チャンク受信を使えば、ダウンロードの進捗バーや途中の解析結果をユーザーに見せるなど、多彩な応用が可能です。特に大規模ファイルや連続メッセージを扱うシーンで、受信完了まで待たせなくて済むのは大きなメリットといえます。

【CTA2の前にひとこと】慣れないうちは一括取得でも問題ありませんが、ユーザーの体験向上やアプリ内でのインタラクションを増やすため、ぜひストリーミング的な受信方法も選択肢に入れてみましょう。

この記事を読んでもっと実践したいと感じたあなたへ

Unity開発を効率よく進めるためには、実践的なスキルと仲間との交流が欠かせません。
そんな方におすすめのステップが、下記の3つです。

1. 有料教材「どこでもUnity教室」でゲーム制作を短期マスター

  • 5日でシンプルなFPS完成
  • C#や最新のInputSystem、FPS実装まで網羅
  • Discord招待+サンプルプロジェクトDLもセット

Unity初心者でも最短5日で3D FPSが完成!今すぐ始める入門チュートリアルはこちら

https://zenn.dev/ryuryu_game/books/fd28de9d8e963a

2. 無料コミュニティで、疑問をすぐに解消&モチベーションUP

  • 初心者~中級者までOK
  • 質問サポートが充実
  • 学習仲間と切磋琢磨

Discordサーバー参加はこちら

https://discord.gg/5FwuKCacNy

3. “ゲーム開発所RYURYU”がトータルサポート

  • コナラ総販売200件超
  • VR/AR/AIなど最新技術にも精通
  • 多数の出展実績

ご相談・お問い合わせはこちら

https://coconala.com/users/1772507

以上で、UnityWebRequestとDownloadHandlerScriptを組み合わせたチャンク受信について解説しました。初心者にとっては少しハードルが高いと感じるかもしれませんが、仕組みを理解すれば難しくありません。ぜひ本記事を参考に、よりスムーズかつユーザーフレンドリーなネットワーク機能を実装してみてください。

Discussion