仮想アセットのワークフローについて

お世話になります。仮想アセットのワークフローについてお尋ねします。

仮想アセットを永続的な保管場所にPerforceを、

キャッシュにローカルファイルシステムを使って実験しています。

エディタ内での仮想アセットの利用はできているようです。

解除やツール(UnrealVirtualizationTool)の使い方について困っています。

■1■仮想化を解除するとき

エディタで仮想化を解除するときに、

1)エディタ設定のVirtualized Asset Rehydrate をチェック

2)戻すアセットをチェックアウト

3)Asset ActionからRehydrate Assetを実行

という手順で行えますが、仮想化できる環境のままUE内でサブミットすると、

再度仮想化されてしまいます。

Q1

解除時に想定されているワークフローは、

A.仮想化を解除するときは、DefaultEngine.iniの

[Core.ContentVirtualization]で

SystemName=None

または仮想アセットのための設定を削除してから、

UE内で解除作業するのが想定されるワークフロー

B.UE(エディタ)内でサブミットせずに、

P4Vなど外部でサブミットすることが想定されるワークフロー

いずれかなのでしょうか?

それとも別の良い方法がありますか?

■2■UnrealVirtualizationToolでの仮想化解除について

Engine\Binaries\Win64\UnrealVirtualizationTool.exe -ClientSpecName=P4CLIENT -Mode=Rehydrate -PackageDir=ディレクトリ

のようにエディタで解除できるアセットに対して実行しました(P4CLIENTは実際には利用できるワークスペース名)

エラーになったのですが、アセット名の前後に出るエラーメッセージがコマンドプロンプト上で???と文字化けして

理由がわかりません

(そもそも理由に心当たりもありません、アセットは1の質問にあるエディタ操作によっては仮想化を解除できます)

ログファイルも文字化けしており、エンコードを変えてみてもわからなかったです

-PackageDirでフォルダ単位で行っても-Packageでアセット単位で行っても同じです

-PackageDirのとき仮想化されたアセットにだけ反応しているので、仮想状態は正しく認識できているようです

Q2-1

こちらの理由がわかるように文字化けさせずにツールを動かす方法を教えてください

Q2-2

文字化けが直ればわかるのかもしれませんが、

よくある事例から考えられそうなエラー理由はありますか?

(文字化けの理由ではなく、解除が失敗する理由)

■3■UnrealVirtualizationToolでの仮想化について

exe実行時の例をみると

UnrealVirtualizationTool.exe -ClientSpecName=P4CLIENT -Mode=Virtualize -Path=

のようですが、Pathに反応しないようでした

Q3-1

正しいファイルの指定方法はどうなりますか?

(公式のドキュメントサイトは、古い方式で-Mode=Changelistなどとなっているようでした)

こちらで解除時と同じPackageDirなどを試したところ、

対象のファイルを認識しているようではありました

ただ解除時と同様にメッセージが???と化けた状態で全て警告が出て、何も変換されません

(エディタ上では変換できます)

Q3-2

こちらの理由がわかるように文字化けさせずにツールを動かす方法を教えてください

Q3-3

文字化けが直ればわかるのかもしれませんが、

よくある事例から考えられそうなエラー理由はありますか?

(文字化けの理由ではなく、仮想化が失敗する理由)

Q3-4

なお仮想アセットの仕組みからすると、-Changelist <CL#> -Submit を付けなければ、

実用的な意味がないと思えますが、その認識で良いでしょうか?

※警告で失敗しているためか、メタデータ側はサブミットされていませんが、変換は進んでいるのかペイロード側のディポにはデータが増えていました

メタデータが変化していないので使えないと思いますが…

以上、よろしくお願いします。

お世話になっております。

Q1

エディタのRehydrateは実験的な機能で既定では有効になっていません。解除したアセットをエディタで開いて保存すると再度仮想化されるため安定しません。実際のプロジェクトではUnrealVirtualizationTool(UVT)やコマンドレットを使うのが想定されています。

プロジェクト全体から仮想化を外したい場合はDefaultEngine.iniで

[Core.VirtualizationModule]

EnablePayloadVirtualization=false

と設定すれば新規アセットは仮想化されません。既存アセットはUVTでRehydrateします。

一部のアセットだけ解除する場合はVirtualizationFilterSettingsで対象外に設定して将来再仮想化されないようにする必要があります。

結論としてA(ini変更)やB(P4Vでサブミット)も場合によっては正しいですが、運用としてはエディタのRehydrateではなくUVTや専用のコマンドレットを使うのが基本です。

Q2 UVTでの解除について

見たことない問題ですが、コンソールの文字コードと関係があって、UTF-8に切り替えると解決できるかと思います。

Q3 UVTでの仮想化について

-Pathはアセット一覧を記載したテキストファイルを渡すオプションです。通常は-PackageDir(ディレクトリ単位)や-Package(ファイル単位)を使います。-Changelist <CL#>でチェンジリスト単位も可能です。

失敗の要因は解除と同じく、ファイルパスではなくパッケージ名を渡している、あるいはプロジェクトをマウントしないため解決できない形式を渡しているケースです。

-Changelist <CL#> -Submitについては、仮想化自体は-Changelistのみで可能ですが、実用的にはSubmitとセットで扱う必要があります。Epic内部では専用SubmitToolで処理しているためUVTの-Submitは使っていませんが、外部チームでは利用可能です。

お手数ですが、よろしくお願いします。

お世話になっております。

トラッキングのため、こちらの件をクローズさせていただきます。

追加情報や質問があったら、いつでも改めてオープンしてください。

お手数ですが、よろしくお願いします。

Q1について承知しました。

Q2とQ3については再検証を予定しています。結果が出たら返答します。

現在、弊社のPerforce環境が本件の検証をできる状態にないため、整備できたら再開させていただきます。すみません。

お待たせしてすみません。検証を再開できました。

Q2(UVTでの解除),Q3(UVTでの仮想化)について、ともに期待した動作を確認できました。

問題自体は解決しましたが、より良い解決策(手順)がないか気になる点があります。

以下、今回の解決方法をあげて、疑問点を質問させていただきます。

●コマンドの文字化けの理由

コマンドプロンプトの文字コードを変えても解決はしなかったですが、

問題になる文字を出しているコードを特定できました。

Engine\Source\Developer\Virtualization\Private\PackageVirtualizationProcess.cpp line 477 あたり

メッセージがLOCTEXTでローカライズされていました。

弊社の.uprojectでは言語を英語にはしていますが、UVTは.uprojectを指定していません。

言語はどのように選択されるのでしょうか。

ひとまず確実にエラーがわかるように、そのままFStringでコードの英語を出すようにしました。

Q4.UVTでLOCTEXTを正しく出力するための言語設定はどのようにすべきですか?

●当初の実験が失敗したエラーの理由

これが本件の肝であり、こちらが勘違いしていた点ですが、

-PackageDirで指定しているディレクトリにある.uassetが書き込みできないためのエラーでした。

-Mode=Virtualizeでも-Mode=Rehydrateでも、

-PacakgeDirにあるファイルをコマンド実行前に自前でチェックアウトする必要があると理解しました。

仮想化(-Mode=Virtualize)では、そのチェックアウト時のチェンジリストを-Changelist=<CL#> -Submitで渡すことで、

仮想化の結果を反映できました。

Q5.-Mode=Virtualizeでは-Changelistと-SubmitでUVT内でサブミットされますが、-Mode=Rehydrateではサブミットは行われないようです。

エディタ内からサブミットすると再度仮想化してしまうので、UVT実行後にp4コマンドやP4Vでサブミットすることになります。

これは、解除のフローでは仮想化時と違ってペイロードとの同時サブミットが必要ではないことから、Perforceの機能を完全に切り離して設計してあるためで、

そのように外部でサブミットするのが、期待している解除時の作業の流れでしょうか?

以上、よろしくお願いします。

お世話になっております。​

Q4: UVTのLOCTEXTは現在のUE cultureを参照します。.uprojectを指定しない場合はOSのcultureに依存します。

英語で安定した出力を得たい場合は、-culture=enとか指定して起動し、文字化けを防ぐために -UTF8Outputを併用してください。

Q5: P4関係の部分が含まれているため100%でいいにくいですが、想定された動作かと思います。-Mode=Virtualizeはペイロードのアップロードとメタデータ更新を同じチェンジリストで処理するため、-Changelistと-Submitが利用できます。-Mode=Rehydrateはローカルパッケージの復元のみを行い、外部ストレージへの書き込みを伴わないため、自動サブミットは行いません。そのためUVT実行後に p4 submitまたは P4V で手動サブミットする運用になります。再仮想化を防ぐには、対象を事前に p4 edit でチェックアウトする、または p4 reopen -c <CL> でCLに紐付けておく必要があります。またVirtualizationFilterSettingsで対象を除外するか、DefaultEngine.iniで一時的にEnablePayloadVirtualization=falseを設定してください。サブミットはエディタ経由ではなく、外部ツールで行うのが安全です(エディタ保存時に再仮想化される可能性があります)。

Rehydrate機能はまだ初期段階の実装であり、大規模プロジェクトでの本格運用には推奨されません。現時点では限定的なケースでの利用や検証目的にとどめ、量産環境ではUnrealVirtualizationToolまたは専用コマンドレットを使用するのが望ましいです。

よろしくお願いします!​

回答ありがとうございます。

Q4について、残念ながらこちらで-culture=en -utf8outputをつけたり、コマンドプロンプトの文字コードをUTF-8にしたりもしてみましたが、英語でのメッセージも確認できなかったです。

ただ設計思想はわかり、実行環境依存の問題ともわかったので、あとはこちらで回避します。

Q5についても設計を理解できました。

長らく対応ありがとうございます。本件はこれで終了いただいて大丈夫です。