データの読み込みで落ちているのかと思っていたが、そうではなかった。いや、データの読み込みも正しくやるならアセットマネージャーとかを使った方が良さそうなんだが、PCゲーム開発ならそこまで気を使わなくても大丈夫なのかもしれない。とにかくデータ読み込よりも面倒な状況に陥ったかもしれない。モーフターゲットのコピーで落ちている。
モーフターゲットのコピーには次のようなプラグインが約8,000円弱で売られていたりするようだが、このプラグインはUE5.2までしか対応していないらしい。
モーフターゲットのコピーで色々調べていたら、VRM4Uの制作者、はるべえ氏のポストが出てきたりした。流石だ。
じゃあ、俺もそのフラグをtrueにして試してみようかな、と一応APIリファレンスを確認してみたら今は直接メンバを弄らずにSetUseLegacyMeshDerivedDataKey()を使えとあったので、そうしてみた。先ずはEditorで確認したらちゃんと動いた。もともとEditorではモーフターゲットのコピーができる。で、Shippingで動くか確認するためにコンパイルしようとしたらコンパイルエラーになった。理由は次の通り。
#if WITH_EDITORONLY_DATA
/*Transient data use when we postload an old asset to use legacy ddc key, it is turn off so if the user change the asset it go back to the latest ddc code*/
UE_DEPRECATED(4.27, “Please do not access this member directly; use USkeletalMesh::GetUseLegacyMeshDerivedDataKey() or USkeletalMesh::SetUseLegacyMeshDerivedDataKey().”)
bool UseLegacyMeshDerivedDataKey = false;static FName GetUseLegacyMeshDerivedDataKeyMemberName()
{
PRAGMA_DISABLE_DEPRECATION_WARNINGS
return GET_MEMBER_NAME_CHECKED(USkeletalMesh, UseLegacyMeshDerivedDataKey);
PRAGMA_ENABLE_DEPRECATION_WARNINGS
}// USkinnedAsset interface
virtual bool GetUseLegacyMeshDerivedDataKey() const override
{
WaitUntilAsyncPropertyReleased(ESkeletalMeshAsyncProperties::UseLegacyMeshDerivedDataKey, ESkinnedAssetAsyncPropertyLockType::ReadOnly);
PRAGMA_DISABLE_DEPRECATION_WARNINGS
return UseLegacyMeshDerivedDataKey;
PRAGMA_ENABLE_DEPRECATION_WARNINGS
}void SetUseLegacyMeshDerivedDataKey(const bool InUseLegacyMeshDerivedDataKey)
{
WaitUntilAsyncPropertyReleased(ESkeletalMeshAsyncProperties::UseLegacyMeshDerivedDataKey);
PRAGMA_DISABLE_DEPRECATION_WARNINGS
UseLegacyMeshDerivedDataKey = InUseLegacyMeshDerivedDataKey;
PRAGMA_ENABLE_DEPRECATION_WARNINGS
}
#endif
UseLegacyMeshDerivedDataKey関連は丸ごとEditorでしか弄らせないってなっている。ここでDDC keyだのDDC codeだのが出てきて、なんのこっちゃ?となった。
ググってみると、Derived Data Cache(派生データキャッシュ) の略らしい。
DDC での配布
クックされたビルドは DDC を必要としないか、または使用しないため、クック処理はゲームのパッケージ化に推奨される方法です。しかし、必要であれば DDC を配布するためにパッケージ化することができます。DDC のパッケージングエンジンの「Engine/Binaries/Win64」ディレクトリから UnrealEditor.exe を実行して、以下の引数を渡します。
UnrealEditor.exe ProjectName -run=DerivedDataCache -fill -DDC=CreatePak
これにより、「Project\DerivedDataCache」ディレクトリに DDC.ddp ファイルが作成されます。
エンジンは .ddp ファイルを自動的に検出して使用します。
たぶんUseLegacyMeshDerivedDataKeyはDDCを弄るためにある。
基本的にクックされた後(Editorを使わない状態)ならDDCは関係ない。
だからUseLegacyMeshDerivedDataKey関連がEditorのみとなっているんだろう。
はるべえ氏は次のようにもポストしているが、そこまでやらないとDDC止まりだから追加したはずのMorphが消えてしまうのかもしれない。
じゃあ俺はどうすればいいのか?だが、ゲーム起動から終了までの一時的な設定で構わないんだが、DDCが使われていなければ、つまりShipping版だとエンジンを弄ってUseLegacyMeshDerivedDataKeyをtrueにしても意味がない。しかし「必要であれば、DDCを配布するためにパッケージ化することが~~エンジンは .ddp ファイルを自動的に検出して使用します。」とある。つまりパッケージ版でもDDCを使うことができるようなので、そうすることにして、エンジンを書き換えれば(Editor Onlyを外すだけ)できるはずだ。もちろんそれで動くとは限らないが。
たぶんキャッシュと言ってもCPUの1次キャッシュや2次キャッシュのような高速なものじゃなくて、シッピング版なら基本使わないってくらいなんだから、DDCを使うことにしたらたぶん重くなるんだ。Shipping版は明らかに軽い、サクサク感があるが、それがなくなっちゃうんだと思う。それを捨ててまでモーフターゲットをコピーすべきかどうか?それか他にもっと良いやり方があるんだろうか。
コメント