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のアップデートで改善される可能性もあります。その際は公式の実装に従うことをお勧めします。