注目キーワード

clusterのCCKで回線速度が遅い時のアップロード失敗を改善する方法

  • 2024年12月14日
  • 2024年12月14日
  • cluster
  • 42回
  • 0件

clusterのワールド制作で悩ましい問題の一つが、回線速度が遅い環境でのアップロード失敗でした。特に、上り回線が遅い環境では、アップロードが頻繁に失敗してしまい、何度も再試行する必要がありました。

この記事では、CCKのコードを少し修正することで、アップロード失敗を大幅に減らす方法を紹介します。

この修正はあくまでも自己責任で行ってください

筆者の環境(上り8Mbps)では、50回連続で失敗していた状況が、100回に1回程度まで改善されました。

■動作環境

  • Unity 2021.3.4f1
  • CCKバージョン: 2.21.0がインストール済み
  • Windows OS

必要なスキル

  • C#の基本的な知識(ファイル編集ができる程度)
  • UnityでのClusterワールド制作経験

問題の状況は?

発生した問題点は以下の通り:

  • 回線速度が遅い環境で、通信エラーが頻繁に発生
  • 最悪の場合、50回連続でアップロードに失敗
  • ワールドのアップロードを何度もやり直す必要がある

環境条件

  • 回線速度:上り8Mbps程度の環境で発生
  • 問題発生時のアップロードデータ量:
    • 1プラットフォームあたり約100MB
    • 4プラットフォーム合計で約400MB

改善方法はこちら!

Windowsの例で解説します。

①:Unityが管理している共通ファイルの修正

以下のCCKのソースコードを開きます。

C:\Users\[ユーザー名]\AppData\Local\Unity\cache\packages\registry.npmjs.com\mu.cluster.cluster-creator-kit@[バージョン]\Editor\Api\RPC\UploadVenueService.cs

このファイルは、PCにインストールされているUnity全体で共有しているファイルです。

※[バージョン]のところには、CCKのバージョンが入ります。

■実際にコードの修正

ソースファイル「 UploadVenueService.cs」を開いたら、「UploadVenueAsync関数」について

以下のように修正します。

UploadVenueAsync関数の全体像
async Task UploadVenueAsync(CancellationToken cancellationToken)
{
    isProcessing = true;

    try
    {
        var uploadRequest = new PostUploadRequestService(accessToken, isBeta);
        var uploadRequestRespose = await uploadRequest.PostUploadRequestAsync(venue.VenueId, cancellationToken);
        Debug.Log(TranslationUtility.GetMessage(TranslationTable.cck_upload_request, uploadRequestRespose.UploadRequestId));
        uploadRequestId = uploadRequestRespose.UploadRequestId;
        uploadStatus[UploadPhase.PreProcess] = true;


        //修正箇所!「順次アップロード」に変更するところ
        //1プラットフォームごとに、ワールドデータ送信
        foreach (var platformInfo in exportedAssetInfo.PlatformInfos)
        {
            await UploadAssetBundlesAsync(platformInfo, cancellationToken);
        }

        //元のコード部分(変更前のコード)
        //全プラットフォーム分、一気にワールドデータ送信
        //await Task.WhenAll(
        //    exportedAssetInfo.PlatformInfos.Select(platformInfo => UploadAssetBundlesAsync(platformInfo, cancellationToken)));


        var notifyFinishedRequest = new PostNotifyFinishedUploadService(accessToken);
        completionResponse = await notifyFinishedRequest.PostNotifyFinishedUploadAsync(
            venue.VenueId, uploadRequestId, worldDescriptor, isPreview, cancellationToken);

        Debug.Log(TranslationUtility.GetMessage(TranslationTable.cck_notify_upload_finished, completionResponse.UploadRequestId));
        uploadRequestId = null;
        uploadStatus[UploadPhase.PostProcess] = true;

        onSuccess?.Invoke(completionResponse);
    }
    catch (Exception e)
    {
        HandleError(e);
    }
    finally
    {
        isProcessing = false;
    }
}

※上記の内容はCCKバージョン: 2.21.0のときのものです。CCKのバージョンにより、修正箇所が変わる可能性があります。

②:作業中のプロジェクトを開く

あなたが作業しているプロジェクト側(clusterにアップデートするプロジェクト)のファイルを開いて、どこでもよいので1文字編集(改行を1つ入れる程度)して保存。

[自分のUnityプロジェクトがあるフォルダ]\Library\PackageCache\mu.cluster.cluster-creator-kit@[バージョン]\Editor\Api\RPC\UploadVenueService.cs

これは、今作っているワールドのプロジェクトフォルダ内にあるファイルです。

対応後、先ほど「①:Unityが管理している共通ファイルの修正」で修正した内容が上書きされて反映されます。

 

※重要:修正は必ず次の順序(上記の手順通りに進めれば問題なし)で行ってください
1. まず「Unityが管理している共通ファイル」を修正
2. 次に「作業中のプロジェクトのファイル」で反映作業

逆の手順(プロジェクト側のファイルだけを修正)すると、Unityによって修正内容が上書きされてしまい、改善効果が得られません。

 

技術的な解説

これまでの修正は何をしていたの?
筆者
では、ここからは技術的な解説をしましょう!
専門用語がたくさん出てくるので、よくわからない場合は読み飛ばしOKです。

元のコードの問題点

  • 全プラットフォーム(Windows、Mac、iOS、Android)向けのアセットを同時にアップロード。(回線速度が早ければ、同時アップデートの方が時間短縮できて良いでしょう)
  • 各100MB、合計400MB程度のファイルを同時に送信

その結果、上り8Mbps程度の回線速度では、以下の問題が発生しました。

  • 通信待ちによるタイムアウト
  • 同時アップロードによる帯域の奪い合い

    結果として頻繁な通信エラー

    筆者
    夜の回線混雑の時間帯では、ほぼアップロードは不可能でしたね。
    光回線などの高速回線なら、このような問題は発生しないかもしれません。

    改善点

    • プラットフォームごとに順次アップロード(100MBずつ)
    • 利用可能な帯域を1つのアップロードに集中
    • 通信の負荷を分散することでエラーを抑制

    改善効果

    • 通信エラーの発生頻度が大幅に減少
      • 変更前:最大50回連続で失敗
      • 変更後:約100回に1回程度の失敗率(これがメチャでかい!)
    • アップロード完了までの時間は多少増加するが、失敗が減ることで実質的な作業時間は短縮

    注意事項

    • この修正はあくまでも自己責任で行ってください
    • CCKのアップデート時には再度修正が必要になります。
    • 修正前にバックアップを取ることを強く推奨します

    まとめ

    回線速度が遅い環境でのアップロード失敗は、CCKのコードを少し修正することで大幅に改善できます。同時アップロードから順次アップロードに変更することで、通信の負荷を分散し、より安定したアップロードが可能になります。

    この改善により、ワールド制作者はアップロードの失敗に悩まされることが減り、より創作活動に集中できるようになるはずです。

    筆者
    特に、お題企画のように納期が決まっているものでは、確実にアップロードできることが大事ですね!

    ただし、この方法はあくまでも一時的な回避策であり、将来的なCCKのアップデートで改善される可能性もあります。その際は公式の実装に従うことをお勧めします。