ぼっちプログラマのメモ

UE4とかVRとかについて書いたり書かなかったり。

揺れ骨用自作AnimNodeプラグイン「Kawaii Physics」をUE4からUE5(早期アクセス版)に移行してみた

はじめに

UE5早期アクセスがついにリリースされたぞおおおお!!!!
www.unrealengine.com

そして、↑のサイトのFAQには

UE5 早期アクセスには Unreal Engine 4.26 に対する後方互換性があり、あなたの 4.26 向けのプロジェクトを UE5 早期アクセスで開くことが可能です。将来リリースされる Unreal Engine 4.27 については、4.27 向けのプロジェクトは早期アクセスとの互換性がありません。ただし、4.27 のプロジェクトは UE5 のフルリリースでは開くことができるようになる予定です。

とあります!

ということで、これまでUE4で開発していたKawaiiPhysicsをUE5で動かしてみましたが、少し対応が必要だったので備考録も兼ねて記事にしました。

話はいいからUE5版を使わせろ!という方はこちらからどうぞ
github.com

対応したこと

UnrealBuildTool.exe が見つからず実行できない不具合への対応

早速これまでのプロジェクトの .uproject を UE5-EAに変更した後にGenerate Visual Studio Project files`をすると

Couldn't find UnrealBuildTool at 'C:/Program Files/Epic Games/UE_5.0EA/Engine/Binaries/DotNET/UnrealBuildTool.exe'

と書かれたエラーウィンドウが出てきました。

軽く調べると修正途中の不具合のようで…UnrealGameSyncまたはGenerateProjectFiles.batを試してみてという状況のようです。が、面倒だったのでこちらの方法で解決しました。

僕の環境の場合だと以下の通り。手っ取り早く対応したかったのでフルパスを直指定という雑対応。

"C:\Program Files\Epic Games\UE_5.0EA\Engine\Binaries\DotNET\UnrealBuildTool\UnrealBuildTool.exe"  -projectfiles -project="F:\Github\KawaiiPhysics-UE5\KawaiiPhysicsSample.uproject" -game -rocket -progress

これでUE5-EA用の.slnが無事作れました。

一部のファイルにアクセスできずビルドできない不具合への対応

これは環境依存な問題の気もしますが、作った.slnをウキウキでビルドしたら↓のエラーで即こけました。

UnrealBuildTool : error : Unhandled exception: System.UnauthorizedAccessException: Access to the path 'C:\Program Files\Epic Games\UE_5.0EA\Engine\Intermediate\EditorRuns\53228' is denied.

これはVisualStudioを管理者権限で実行することで解決

大量に出てきたビルドエラーを黙々と対応する話

やっと各コードのビルドが走ったと思ったら大量のビルドエラーが…ただ、よくよく見ると同じエラーばかりなので対応は楽そうです。

FWidget:: を UE::Widget:: に置換
>F:\Github\KawaiiPhysics-UE5\Plugins\KawaiiPhysics\Source\KawaiiPhysicsEd\Public\KawaiiPhysicsEditModeBase.h(28): error C2039: 'EWidgetMode': is not a member of 'FWidget'
1>  C:\Program Files\Epic Games\UE_5.0EA\Engine\Source\Editor\UnrealEd\Public\UnrealWidget.h(19): note: see declaration of 'FWidget'

KawaiiPhysicsEditMode, KawaiiPhysicsEditModeBaseで使っている FWidget::~ ですが、UE::Widget:: にnamespaceが変わってしまったので大量のエラーがでてました。例えば、FWidget::EWidgetModeとか

一気に置換して問題解決

USkeletalMesh::GetSkeleton()を使うように変更
1>/KawaiiPhysicsEditMode.cpp(73): warning C4996: 'USkeletalMesh::Skeleton': Please do not access this member directly; use USkeletalMesh::GetSkeleton() or USkeletalMesh::SetSkeleton(). Please update your code to the new API before upgrading to the next release, otherwise your project will no longer compile.
1>KawaiiPhysicsEditModeBase.cpp(362): warning C4996: 'USkeletalMesh::Skeleton': Please do not access this member directly; use USkeletalMesh::GetSkeleton() or USkeletalMesh::SetSkeleton(). Please update your code to the new API before upgrading to the next release, otherwise your project will no longer compile.
1>KawaiiPhysicsEditModeBase.cpp(432): warning C4996: 'USkeletalMesh::Skeleton': Please do not access this member directly; use USkeletalMesh::GetSkeleton() or USkeletalMesh::SetSkeleton(). Please update your code to the new API before upgrading to the next release, otherwise your project will no longer compile.
1>KawaiiPhysicsEditModeBase.cpp(696): warning C4996: 'USkeletalMesh::Skeleton': Please do not access this member directly; use USkeletalMesh::GetSkeleton() or USkeletalMesh::SetSkeleton(). Please update your code to the new API before upgrading to the next release, otherwise your project will no longer compile.

というエラーが出ていたので、SkeletalMesh->Skeleton としていた箇所を SkeletalMesh->GetSkeleton() に変更

EditorFrameworkモジュールを追加
Module.KawaiiPhysicsEd.cpp.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __cdecl FEditorModeInfo::FEditorModeInfo(class FName,class FText,struct FSlateIcon,class TAttribute<bool>,int)" (__imp_??0FEditorModeInfo@@QEAA@VFName@@VFText@@UFSlateIcon@@V?$TAttribute@_N@@H@Z) referenced in function "public: void __cdecl FEditorModeRegistry::RegisterMode<class FKawaiiPhysicsEditMode>(class FName,class FText,struct FSlateIcon,bool,int)" (??$RegisterMode@VFKawaiiPhysicsEditMode@@@FEditorModeRegistry@@QEAAXVFName@@VFText@@UFSlateIcon@@_NH@Z)
1>F:\Github\KawaiiPhysics-UE5\Plugins\KawaiiPhysics\Binaries\Win64\UnrealEditor-KawaiiPhysicsEd.dll : fatal error LNK1120: 1 unresolved externals

しばしば見るModuleが足りないよ系のエラーです。上記エラーで出てくる FEditorModeInfoは Engine\Source\Editor\EditorFramework\Private\Tools\Modes.h にあるので、Plugins\KawaiiPhysics\Source\KawaiiPhysicsEd\KawaiiPhysicsEd.Build.cs の PrivateDependencyModuleNames に "EditorFramework" を追加して解決。
(どうやらEditModeの基底のFEdModeで使われてるようです。その関係でAnimGraph.Build.cs にもこのモジュールが追加されてます)


上記の対応で無事ビルド成功し、KawaiiPhysicsがUE5上で動作するようになりました!
f:id:pafuhana1213:20210527184252p:plain

最後に

今回は運悪くUE5でコードが変わった部分の影響を受けて修正作業が発生しましたが、その他の部分に関しては全く追加作業をしなくてもUE5上で動いて感動です!もちろんまだ早期アクセスなので今後どうなるかは未知数ですが…プロジェクト・プラグイン側の実装がシンプルだったりBPのみの場合はUE4からUE5への移行は比較的ラクになりそうな気がしました!

めでたしめでたし

UE5 正式リリース後の対応編に続く