ぼっちプログラマのメモ

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

【UE4】Subsystem, GAS, DataAssetを活用して実装した会話システムについて雑多に書いてみた

f:id:pafuhana1213:20211213133528p:plain

はじめに

本記事はUnreal Engine (UE) Advent Calendar 2021(カレンダー1)の13日目の記事です!
12日目はじゅる (@xxJulexx) | Twitterさんによる
qiita.com
でした!DMX周りは基本的な知識もあまりないのでこういった記事は大変助かります…いつもありがとうございます!

アドベントカレンダーの記事はいつも何を書こうか悩むのですが…以前に解説してほしいと要望のあった『Subsystem, GAS, DataAssetを活用して実装した会話システム』について書こうと思います!ちなみに、実際に動いてる様子はこちら。

個人的には手応えはある程度感じてますが…まだまだ実装途中の部分もあったり…プロジェクトや実現したい表現によって色々変わってくると思うので…あくまで一例として参考程度に読んで頂けますと幸いです!そういったこともあり、作り方というよりも設計・思想の話が多めになってます。

あと、本記事はSubsystem, GAS, DataAssetに関する講演を既に読んだ・見た方を対象としています。もしまだという方は先にこちらをどうぞ。

www.slideshare.net
www.youtube.com

続きを読む

Gameplay Effect にてModifierの値をBPから直接指定できる Set by Caller の使い方について

Gameplay Effectについてはこちら
okawari-hakumai.hatenablog.com
historia.co.jp
qiita.com
github.com

Gameplay EffectによるAttribute Setへの設定・変更値は基本的にAbilityやCurveTableや自作Magnituteで設定するのですが、自分のプロジェクトにてBPから直指定したいケースがあったので調べたらヒットしたのがこちらスレッド
f:id:pafuhana1213:20210703143340p:plain
f:id:pafuhana1213:20210703143348p:plain
引用:GameplayEffect: How to set magnitude programatically? - UE4 AnswerHub より

上の画像が全てな感じがありますが、

  1. Gameplay Effect の ModifiersのMagnitude Calculation TypeをSet by Caller に
  2. Data TagにBPから設定する際の識別用にGameplayTagを設定
  3. ↑の画像のようにBPを組む

これで手元の環境(UE4.26.2)にて、BPから直接Gameplay Effectの値を指定して適用することができました。多分C++でも同様にして組めるはずです。
雑ですがSet By Callerの使い方に関する資料がほぼなかったのでメモ代わりに。おしまい

【UE4.25】Mac環境でのビルド時に MultitouchSupport でエラーが出たときの解決方法

2回ほど引っかかったので自分用メモも兼ねて

UE4.25 & Mac環境でエンジンビルドなどを行うと以下のエラーが出る可能性があります。

clang: error: no such file or directory: '/System/Library/PrivateFrameworks/MultitouchSupport.framework/Versions/Current/MultitouchSupport'

で、これは以下の変更を組み込むことで修正できます。
https://github.com/EpicGames/UnrealEngine/commit/1d252ee345cdf6c232b20c3b4bf14f13bb569c9d

なお、この修正はUE4.26で組み込まれています。
issues.unrealengine.com

おしまい

揺れ骨用自作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で流用する方法について説明します。

続きを読む