ぼっちプログラマのメモ

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

揺れ骨用自作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 正式リリース後の対応編に続く

【UE4】Calculate Directionノードを使って移動方向にキャラクタの体を傾ける方法について

はじめに

「お!見たことないノード!ググっても情報少ないし新しいノードか!?」と意気揚々とツイートしたら…

フルボッコにされました(´;ω;`)ブワッ

f:id:pafuhana1213:20210126185845p:plain

ということで、泣きながら試しに使ってみた所いい感じだったのでサクッと記事にしてみました

公式ドキュメント:
Calculate Direction | Unreal Engine Documentation

続きを読む

【UE4】GUIフレームワーク「Dear ImGui」を使ってデバッグ・ツール用UIを作ってみよう! < 導入・基本編 >

本記事はUnreal Engine 4 (UE4) Advent Calendar 2020 13日目の記事 です。
今回はC++メインということもありプログラマさん向けです。非エンジニアの方はプログラマさんに実装を相談又は手伝ってもらいましょう!

はじめに

「Dear ImGui」はご存知でしょうか?
C++を使って直感的かつ簡単にGUIを構築できる非常に優れたGUIフレームワークで、デバッグやツール用のUIを構築する際によく用いられます。従来のライブラリですとウィンドウを出したりボタンに処理を紐付けたりするのに手間がかかりましたが、Dear ImGui(以下、ImGui)なら非常にシンプルに書くことが出来ます。まずは下の参考記事をご覧ください!簡単過ぎて驚くと思います!

qiita.com

更に簡単だけでなく非常に多機能です。デフォルトで用意されている物を使うことで下図のようなGUIを作成することが可能です。

f:id:pafuhana1213:20201212221547p:plain:w400f:id:pafuhana1213:20201212222943p:plain:w400
https://github.com/ocornut/imgui より

UE4の標準機能でデバッグ・ツール用UIを作る場合はUMGを使うことになりますが、上図のようなデバッグ向けのパーツを一から用意するのは正直大変です。また、ImGuiはUE4のビューポート上に別ウィンドウ的な形で表示されるので、下図のように自由にウィンドウを配置・整理することが可能です。デバッグ用UIが作業のジャマになっては本末転倒なのでこのような機能は非常に助かります(念の為触れますが、ゲームで実際に使うUIのようなアニメーションしたり様々なグラフィックを表示するのにはImGuiは向いていません。あくまでデバッグ・ツール用UI向けです)。

そんな神ってるDear ImGuiはその知名度・注目度が年々増してきており、最近だとCEDEC AWARDS 2019 のエンジニアリング部門で優秀賞を受賞したり、FINAL FANTASY VII REMAKEにて採用されたりしています!すごい!

更に、有志による UE4 対応版Dear ImGuiとして「Unreal ImGui」がなんと公開されています…!
github.com

更に更に、まだ触れていないのですが、実機上で表示したImGuiウィンドウをPCに繋いだマウス・キーボードで制御することが可能になる NetImGuiが組み込まれているようです!こりゃ触るしかないですね…!
github.com
https://github.com/sammyfreg/netImgui/raw/master/Web/img/InputWithNetImgui.gif
https://github.com/sammyfreg/netImguiより


ということでやっと触ってみました。まだ調査しきれていない部分もあるのですが、ひとまず色々動いたので導入・基本部分について書いていこうと思います。
なお、ImGui自体の使い方についてはあまり解説しません。というより、先程の参考記事が素晴らし過ぎるのでそちらをご確認ください(あと、Dear ImGui公式のWikiも是非)

続きを読む

UE4.26で追加されたControl Rig Componentの使い方について <ControlRigの流用編>

本記事はUnreal Engine 4 (UE4) その3 Advent Calendar 2020 4日目の記事 その③です。

その①
UE4.26で追加されたControlRigのループ(Looping)を使って、手の開閉を簡単に実装してみる - ぼっちプログラマのメモ
その②
UE4.26で追加されたControlRigの反転機能(Inversion)の使い方について - ぼっちプログラマのメモ
その③ ここ

ControlRig?ナニソレオイシイノ?という方はこちらをどうぞ

youtu.be
スライド:猫でも分かる Control Rig UE4.25 版

はじめに

UE4.26がついにリリースされました!
(この記事を書いてる今はまだリリースされてないので、本当に時間通りにアップされるかドキドキしながら書いてます)

今回リリースされたUE4.26にて「Control Rig Component」が追加されました。

Control Rig コンポーネント

Control Rig コンポーネントを使用してブループリントからコントロール リグ データにアクセスできるようになりました。これにより、ブループリントでゲームプレイ ロジックを使用してコントロール リグを制御したり、異なるプロポーションのキャラクターに合わせてコントロール リグを再初期化したり、他のコントロール リグ データを直接読み取ったり、書き込んだりできるようになりました。さらに、Control Rig コンポーネントのアクセサーを使用して、スケルタル メッシュ以外のオブジェクトを Control Rig コンポーネント階層にアタッチできるようになりました。
f:id:pafuhana1213:20201203220335g:plain
コントロール リグの新しいセットアップ イベントにより、スケルトンとコントロールを初期化できるようになりました。
コントロール リグの初期化状態の間にスケルトンとコントロールを配置することができます。
ブループリントでゲッター関数とセッター関数を使用して、ボーンおよびコントロールのトランスフォーム/値を取得または設定できます。
コントロール リグのコントロールデバッグ描画が、ブループリントのビューポートに表示されます。
コントロール リグからボーン トランスフォームを取得することで、スタティック メッシュ トランスフォームを制御することができます。
Unreal Engine 4.26 リリース ノート | Unreal Engine Documentation

UE4.25以前ではControlRigとその他の機能の連携があまりできませんでしたが、このControl Rig Componentを使うことでBPとの連携が可能になります!更に、異なるキャラクタ間でControlRigを流用したり、StaticMeshの制御が可能になったりとできることが大幅に増えます!

と言ったことまではこのリリースノートから読み取れるのですが、具体的にどう使うか?は説明されていません。ということで、本記事ではこのControl Rig Componentの使ってControlRigを様々なSkeletalMeshで流用する方法について説明します。

続きを読む

UE4.26で追加されたControlRigの反転機能(Inversion)の使い方について

本記事はUnreal Engine 4 (UE4) その3 Advent Calendar 2020 4日目の記事 その②です。

その①
UE4.26で追加されたControlRigのループ(Looping)を使って、手の開閉を簡単に実装してみる - ぼっちプログラマのメモ
その② ここ
その③
UE4.26で追加されたControl Rig Componentの使い方について <ControlRigの流用編> - ぼっちプログラマのメモ


ControlRig?ナニソレオイシイノ?という方はこちらをどうぞ

youtu.be
スライド:猫でも分かる Control Rig UE4.25 版

はじめに

UE4.26がついにリリースされました!
(この記事を書いてる今はまだリリースされてないので、本当に時間通りにアップされるかドキドキしながら書いてます)

今回リリースされたUE4.26にて
「コントロール リグの反転(Control Rig Inversion )」がサポートされました。

コントロール リグの反転
f:id:pafuhana1213:20201203141544g:plain
コントロール リグの反転機能により、シーケンサーを使用して編集できるアニメーション リグに既存のアニメーションを再マッピングできるようになりました。また、使いやすいコントロール リグを使用して、既存のスケルタル アニメーションを変更できるようになりました。新しい Backwards Event ノードでは、ボーンがコントロールやその他のコントロール ロジックにどのようにマッピングされるかを定義します。

数値プレシーケンサー機能により、シーケンサーでアニメーションのフレームごとにバックワード イベントを実行することで、コントロール リグにベイクできるようになりました。
Unreal Engine 4.26 リリース ノート | Unreal Engine ドキュメント

UE4.25以前でも既存のアニメーションをControlRigで編集することは可能ではありましたが、手順が複雑であったり挙動が安定しないなどの問題がありました。しかし、この反転機能を使うことで簡単に編集することが可能になります。

と言ったことまではこのリリースノートから読み取れるのですが、具体的にどう使うか?は説明されていません。ということで、本記事ではこの反転機能の使い方について説明します。

続きを読む

UE4.26で追加されたControlRigのループ(Looping)を使って、手の開閉を簡単に実装してみる

本記事はUnreal Engine 4 (UE4) その3 Advent Calendar 2020 4日目の記事①です。

その① ここ
その②
【UE4】UE4.26で追加されたControlRigの反転機能(Inversion)の使い方について - ぼっちプログラマのメモ
その③
【UE4】UE4.26で追加されたControl Rig Componentの使い方について - ぼっちプログラマのメモ


ControlRig?ナニソレオイシイノ?という方はこちらをどうぞ

youtu.be
スライド:猫でも分かる Control Rig UE4.25 版

はじめに

UE4.26がついにリリースされました!
(この記事を書いてる今はまだリリースされてないので、本当に時間通りにアップされるかドキドキしながら書いてます)

今回リリースされたUE4.26にて
「コントロール リグの分岐とループ(Control Rig Branching and Looping )」がサポートされました。

コントロール リグの分岐とループ
分岐とループにより、最小限のセットアップで柔軟でダイナミックなコントロール リグを作成することができます。ループを使用すると、反復可能なオブジェクトの集合 (ボーン チェーン、コントロールのリスト) を動的に作成することができます。これにより、グラフのサイズが大幅に縮小され、グラフのパフォーマンス、作成時間、およびリグの柔軟性が向上します。

f:id:pafuhana1213:20201202214706g:plain

  • 新しい分岐/条件ノードにより、条件の要素に基づいてグラフを分岐できるようになりました。
  • ループでロジックを利用して、より簡潔で柔軟なグラフを作成できるようになりました。
  • 項目のグループ化とサポート ノードをサポートするようになりました。

Unreal Engine 4.26 リリース ノート | Unreal Engine Documentation

特にループ機能は手指のように複数の階層で構築されたボーンを制御する際にとても有用です!
この機能がないUE4.25の場合は指毎にノードを配置する必要があって大変でしたが、ループ機能を使うことでかなりシンプルに書くことが出来ます!

と言ったことまではこのリリースノートから読み取れるのですが、具体的にどう使うか?は説明されていません。
ということで、本記事ではこのループ機能を使って上図のような制御を実装する方法について説明します。

続きを読む

【UE4】UPROPERTYのmetaを使ってプロパティの表示順を調整する方法について

はじめに

C++で設定したプロパティが意図通りの順序で表示されないなぁ…と悩んでいたら公式ドキュメントにバッチリ書かれてたので自分用メモ
docs.unrealengine.com

DisplayAfter="PropertyName"

このプロパティは、ブループリント エディタでの中で、プロパティが両方とも同じカテゴリにある限り、ソースコードの順番に関係なく PropertyName という名前のプロパティの直後に表示されます。複数のプロパティの DisplayAfter 値と DisplayPriority 値が同じ場合、ヘッダ ファイルで宣言された順番で、名前付きプロパティの後に表示されます。

DisplayName="Property Name"

コードが生成する名前の代わりになるプロパティの表示名です。

DisplayPriority="N"

2 つのプロパティの DisplayAfter 値が同じである、または同じカテゴリで DisplayAfter メタ タグがない場合にこのプロパティがソート順を決定します。優先度が高い値は 1 です。つまり、, meaning that a property with a DisplayPriority 値が 1 のプロパティは DisplayProirity 値が 2 のプロパティに優先します。複数のプロパティの DisplayAfter 値が同じ場合、ヘッダ ファイルで宣言された順番で、名前付きプロパティの後に表示されます。

例:

UPROPERTY(EditAnywhere, meta=(DisplayPriority="1"))