fc2ブログ

凛(kagring)のUE5/UE4とゲーム制作と雑記ブログ

2016 年から UE4 / 2021年から UE5 を触り始めました。勉強したもののメモ用ブログです。ゲーム制作に関するメモや雑記とか色々あります。C++ での Qt、Unity もほんの少しあります。

| PAGE-SELECT | NEXT

≫ EDIT

UE5/UE4 C++でデバッグ文字列(FString)をビューポート(Viewport)に表示する(UEngine::AddOnScreenDebugMessage)

C++でデバッグ文字列(FString)をビューポート(Viewport)に表示する方法です。

公式ドキュメントはこちら。

・FString
https://docs.unrealengine.com/4.27/ja/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/StringHandling/FString/

デバッグ文字列(FString)をビューポート(Viewport)に表示するには
「UEngine::AddOnScreenDebugMessage()」関数
を使います。

ドキュメントはこちら。

・UEngine::AddOnScreenDebugMessage
https://docs.unrealengine.com/4.27/en-US/API/Runtime/Engine/Engine/UEngine/AddOnScreenDebugMessage/1/

こんな感じで記述します。

#include "Engine/Engine.h"

// ビューポートに FString を表示
FString aFStringTest = FString::Printf(TEXT("Test = %02d, %.3f"), 1, 123.456f);
GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, aFStringTest);

第一引数の「uint64 Key」は同じ値の場合は重複表示を避けることができます、指定なしは「-1」のようです。
第二引数の「float TimeToDisplay」は表示時間(秒)を指定します。
第三引数の「FColor DisplayColor」は表示する色を指定します。
第四引数の「const FString & DebugMessage」は表示する文字列(FString)を指定します。

結果はこんな感じになります。
画面に文字列を表示000
ちょっとわかりづらいですが、ちゃんと画面に表示されています。

以下の第五引数と第六引数はデフォルト引数として指定しなくても問題ないようになっています。
第五引数の「bool bNewerOnTop」は新しい表示が上からになるかどうかを指定します。デフォルトは「true」になります。
第六引数の「const FVector2D & TextScale」は表示倍率を指定します。デフォルトは「1.0f,1.0f」となります。

上記二つの追加引数を指定するとこんな感じになります。

#include "Engine/Engine.h"

// ビューポートに FString を表示(第五、第六引数指定版を追加)
FString aFStringTest = FString::Printf(TEXT("Test = %02d, %.3f"), 1, 123.456f);
GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, aFStringTest);
FVector2D aScale(2.0f, 2.0f);
GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, aFStringTest, true, aScale);


結果はこんな感じになります。
画面に文字列を表示001
第六引数を指定した文字列がちゃんと拡大されて表示されています。

基本的にはこの処理自体はBPでの「PrintString」の「Print to Screen」のみ版といったもののようです。
PrintStringのKey000

C++からこの関数を使うとしたらデバッグ用途でしょうか。

| UE4 | 10:00 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

UE5/UE4 サーバー(Authority)かクライアント(Remote)マシンなのかを判別して処理をする(Switch Has Authority)

サーバー(Authority)かクライアント(Remote)マシンなのかを判別して処理をする方法です。

公式ドキュメントはこちら。

・ブループリントでアクタをレプリケートする
https://docs.unrealengine.com/4.27/ja/InteractiveExperiences/Networking/Actors/ReplicatingActors/

スクリプトを実行しているのは Authority (サーバー) なのか、
または Remote マシン (クライアント) なのかを判断するために
Switch Has Authority (もしくは Authority Guard) ノードを追加します。

通常は Authority に設定して、プレイヤーのヘルス値やポイントの配分、経験値の調整など、
クライアント マシンでごまかしが行われてはならないゲームプレイの重要なスクリプトは
サーバーのみが実行できるようにします。


というわけで、サーバー(Authority)かクライアント(Remote)マシンなのかを判別するには
「Switch Has Authority」ノードを使用
します。
サーバーかクライアントかどうか000
サーバー(Authority)であれば「Authority」が実行され、
クライアント(Remote)マシンであれば「Remote」が実行されます。


実際にはこんな感じの記載になりそうです。
サーバーかクライアントかどうか001
そのままですね。

ネットワークゲームを作らなければあまり使わないと思うのですが、いざという時のために知識として知っておくと良さそうです。

| UE4 | 10:00 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

UE5/UE4 マテリアル(Material)で円周率(Pi(π))の値を扱う(Pi)

マテリアル(Material)で円周率(Pi(π))の値を扱う方法です。

こちらのツイートで言及されていましたのでメモです!

「Pi」というノードがマテリアル(Material)ノードにあるようです。
MaterialPIノード001
その名の通り「円周率(Pi(π))」を掛けることができます。

ちなみにこのノードは「Pi」で検索することができます。
MaterialPIノード000

初歩的なことかもしれないですが覚えておきたいですね。

| UE4 | 10:00 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

UE4 UE4プログラマー向け勉強会 in 大阪

UE4プログラマー向け勉強会 in 大阪が開催されましたのでまとめメモです。

・UE4プログラマー向け勉強会 in 大阪
https://connpass.com/event/76815/

| UE4 | 10:00 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

UE5/UE4 終了時に実行されるイベント(Event End Play)

終了時に実行されるイベントについてです。

終了時に実行される「Event End Play」というノードがあります。
EventEndPlay001.jpg
これはアクターやレベルなどで終了時に実行されます。

公式ドキュメントはこちら。

・アクタのライフサイクル
https://docs.unrealengine.com/4.27/ja/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/Actors/ActorLifecycle/

EndPlay
アクタのライフが終わりに近づくことを保証するために数か所で呼び出されます。
プレイ中に Destroy や Level Transitions でこれを発行します。
またアクタを含むストリーミングレベルがアンロードされた場合も発行します。
EndPlay が呼び出されるすべての場所は以下の通りです。

・Destroy の明示的な呼出し
・Play in Editor を終了
・レベル移行 (シームレスな移動またはマップのロード)
・アクタを含むストリーミング レベルをアンロード
・アクタのライフタイムの期限が終了
・アプリケーションをシャットダウン (全アクタを破壊)


とりあえずこんな感じでBPを組んでみました。
EventEndPlay002.jpg
開始時の「Event Begin Play」と終了時の「Event End Play」ですね。

実行するとこんな感じになりました。
※今回はレベルBPに作成して、レベルのLoad時とUnload時の結果になります。
EventEndPlay000.jpg
無事両方のイベントが実行されているようですね(下の方が古い順番)

「Event Begin Play」はBPを作った時点であらかじめ用意されているのですが、
「Event End Play」はない場合も多かった気がするので、有用な場面では上手く使いたいところですね。

| UE4 | 10:00 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

UE4 UE4向けポストプロセスアセット「Chameleon Post Process」

UE4向けポストプロセスアセット「Chameleon Post Process」のメモです。
当時見つけたのですがメモしようと思って忘れていました…(なので古いです)

詳しい記事はこちら。

・Chameleon Post Process 10.0 - なんか色々出来そう!UE4向けポストプロセスアセット!新バージョンがリリース!
https://3dnchu.com/archives/chameleon-post-process-10-0/

紹介動画はこちら。


マーケットプレイスはこちら。

・Chameleon Post Process
https://www.unrealengine.com/marketplace/ja/product/chameleon

| UE4 | 10:00 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

UE5/UE4 カスタムコリジョンプリセットを追加して設定する(Collision、Preset)

カスタムコリジョンプリセットを追加して設定する方法です。

自作のコリジョンのコンポーネントなどを作成した場合など、
既存のコリジョンプリセットから選択するよりも、新たにプリセットを追加したほうが処理が整理されると思います。
コリジョンプリセットの追加と設定をするための方法です。

こちらを参考にさせていただきました。

・UE4 コリジョンについて 基礎編
https://unrealengine.hatenablog.com/entry/2014/07/10/231035

公式ドキュメントはこちら。

・コリジョン反応の参照(Collision Response Reference)
https://docs.unrealengine.com/4.27/ja/InteractiveExperiences/Physics/Collision/Reference/

というわけでやってみました。
まずはメニューの「編集」の「プロジェクト設定」を開きます。
カスタムコリジョンプリセット000

次に「コリジョン(Collision)」を選択します。
カスタムコリジョンプリセット001
「Preset」を選択して、追加する場合は「新規」ボタンを。編集する場合は「編集」ボタンを押します。

新規を選択するとこんな感じのウィンドウが開いて設定して追加することができます。
カスタムコリジョンプリセット002
名前やそのほかの設定をして「承認」ボタンを押すとプリセットが追加されます。

こんな感じで追加されたのを確認することができます。
カスタムコリジョンプリセット003
カスタムプリセットだとアイコンが変わるようですね。

次に追加したコリジョンプリセットを設定してみます。
こんな感じで適当にコリジョンコンポーネントを追加します。
カスタムコリジョンプリセット004

このコリジョンコンポーネントの「コリジョンプリセット」を選択すると、
さきほど追加したコリジョンプリセットが選択できるのが確認できると思います。
カスタムコリジョンプリセット005

こんな感じでカスタムコリジョンプリセットを設定することができるので活用していきたいですね。

| UE4 | 10:00 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

UE4 浮動少数値の端数部分を切り上げて整数に変換する(Ceil)

浮動少数値の端数部分を切り上げて整数に変換する方法です。

参考サイトはこちら。

・Math 表現式
https://docs.unrealengine.com/ja/Engine/Rendering/Materials/ExpressionReference/Math/index.html

「Ceil」という浮動小数を切り上げて整数にするノードがあるようですね。

Ceil 表現式は、値を受け取り、一番近い整数へ 切り上げて 結果を出力します。Floor and Frac も参照してください。

例: 「0.2」の Ceil は「1.0」です。(0.2、1.6) の Ceil は (1.0、2.0) です。

といった感じの挙動になるようです。

・Ceil
浮動小数を切り上げて整数に変換000
「A」はFloatの値を指定します。
「Return Value」は端数部を切り上げた整数になります。

実際にテストしてみました。
浮動小数を切り上げて整数に変換001
こんな感じでノードを繋いでみました。

結果はこんな感じに。
浮動小数を切り上げて整数に変換002
「1.8」というFloat値の端数部が切り上げられて「2」という整数に変換されました。
「1.2」というFloat値の端数部が切り上げられて「2」という整数に変換されました。

ここらへん結構簡単にできるのはいいですね!

| UE4 | 10:00 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

UE5/UE4 C++でデータテーブル(Data Table)のデータを取得する(UDataTable、Find Row)

C++でデータテーブル(Data Table)のデータを取得する方法です。

こちらを参考にさせていただきました。

・Get Data Table Row in c++
https://forums.unrealengine.com/t/get-data-table-row-in-c/143296

FName LocalRowName = FDataTableRowHandle.RowName;
FYourStruct* OutRow = FDataTableRowHandle.DataTable->FindRow< fyourstruct >(LocalRowName, "");


・UE4 DataTableからのパラメータ取得とJSONインポートについて
https://qiita.com/unknown_ds/items/4da34cccb3181e633efe

auto _Record = MyDataTable->FindRow< fmydatatable >(_Names[_Lp], FString());


抜粋すると上記のように「Find Row」関数を使って取得するようです。

こんな感じの構造体を作ってデータテーブルに割り当てます。

// データテーブルに割り当てる構造体
USTRUCT(BlueprintType)
struct FDataTableTest : public FTableRowBase
{

GENERATED_BODY()

public:

UPROPERTY(EditAnywhere, BlueprintReadWrite)

float Param = 0.0f;

};

割り当てたデータテーブルから行のデータを取得するにはこんな感じで書きます。

// データテーブル
UDataTable* aDataTable;
// データテーブル取得
auto aRecord = aDataTable->FindRow< FDataTableTest >("RowName","");

データテーブル(Data Table)変数の「Find Row」関数を使ってデータテーブルの行のデータを取得思案す。
「Find Row」の第一引数には「行の名前(定義名)」を指定します。
第二引数は…調べてもよくわかりませんでした。
調べても上記第一引数を指定して、第二引数は指定なしでデータを取得していることが多いのですよね…。

ちなみになのですが「auto」変数については以下の記載がドキュメントにあります。

・コーディング規約
https://docs.unrealengine.com/4.27/ja/ProductionPipelines/DevelopmentSetup/CodingStandard/

'auto' キーワード
以下の例外がなければ、C++ コードで auto を使わないようにします。
初期化している型について常に明示的でなければなりません。
つまり、読み手がその型を見えるようにしなければなりません。
このルールは C# の ‘var' キーワードの使用にも適用されます。

auto の使用はどのような場合に認められますか?
・lambda を変数にバインドする必要がある場合です。lambda 型はコードで表現できないからです。
・iterator 変数に対して認められます。しかし、iterator の型が非常に詳細で読みづらくなります。
・テンプレートのコードで認められます。この場合、式の型は簡単に見分けることはできません。これは高度な事例です。

コードの読み手に型がはっきり見えるようにすることは非常に重要です。
一部の IDE では型を推測できますが、これはコンパイル可能な状態にあるコードに依存します。
merge/diff ツールのユーザーもサポートしません。または、
GitHub 上など各ソース ファイルを別個に見る場合などもサポートしません。

認められる方法で auto を使う場合、型名で使うように常に正しく const、 & または * を使うようにしてください。
`auto` を使うと、推測された型を希望の型にします。


なのであまり「auto」変数を使わないほうがよいのかなと…。
上記データテーブルのデータ取得のコードは以下のように構造体指定で書くこともできます。

// データテーブル
UDataTable* aDataTable;
// データテーブル取得
FDataTableTest* aRecord = aDataTable->FindRow< FDataTableTest >("RowName","");

こちらの方が他の人に対してもわかりやすいかもしれないですね。

| UE4 | 10:00 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

UE5/UE4 操作キャラクターかどうかを判別する(Is Player Controlled)

操作キャラクターかどうかを判別する方法です。

操作しているキャラクターかどうかを判別するには「Is Player Controlled」ノードを使うのが良いみたいです、
操作キャラクターかどうか001
「Target」には「Pawn」を指定します。

公式ドキュメントはこちら。

・Is Player Controlled
https://docs.unrealengine.com/4.26/en-US/BlueprintAPI/Pawn/IsPlayerControlled/

こんな感じで使います。
操作キャラクターかどうか000
そのまんまですね。

操作キャラクター以外に仲間キャラクターがいたりする場合は、このノードで判別してもいいのかなと思いました。

| UE4 | 10:00 | comments:0 | trackbacks:0 | TOP↑

| PAGE-SELECT | NEXT