fc2ブログ

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

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

| PAGE-SELECT | NEXT

≫ 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↑

≫ EDIT

UE5/UE4 C++におけるクラス(Class)、構造体(Struct)、列挙型(Enum)、変数、引数の命名規則(AActor、UObject、SWidget、FStruct、EEnum、bBool、IInterface)

C++におけるクラス(Class)、構造体(Struct)、列挙型(Enum)、変数、引数の命名規則のメモです。
ドキュメントを見れば書いてあるのですが忘れやすいのでメモということで…。

公式ドキュメントはこちらになります。

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

クラス(Class)はこう記載されています。

テンプレートクラスには接頭辞 T が付きます。
UObject から継承されるクラスには接頭辞 U が付きます。
AActor から継承されるクラスには接頭辞 A が付きます。
SWidget から継承されるクラスには接頭辞 S が付きます。

C抽象インターフェースのクラスには接頭辞 I が付きます。
列挙型変数には接頭辞 E が付きます。
その他のほとんどのクラスには接頭辞 F が付きますが、サブシステムによっては別の文字が使用されます。

継承元によって接頭辞が変わる。といったもののようですね。

構造体(Struct)はこう記載されています。

Typedef には、その型に対して適切な接頭辞が付きます。
構造体の typedef の場合は、F に、
UObject の typedef の場合は、U になる等のようになります。


列挙型(Enum)はこう記載されています。

列挙型変数には接頭辞 E が付きます。


変数はこう記載されています。

ブール変数には、必ず接頭辞 b を付けてください (例、bPendingDestruction や bHasFadedIn)。


引数はこう記載されています。

必須ではありませんが、参照から渡されたり、関数によって値が書かれる場合は、
関数パラメータ名に「Out」を接頭辞として付けることを推奨します。
こうすることで、引数に渡された値が関数によって置き換えられることが明白になります。

In または Out のパラメータも boolean の場合、In/Out の接頭辞の前に b を付けます (例: bOutResult)。


UE5/UE4 独自のルールだと思いますが、慣れてくれば考えなくてもいけそうな気がしますね。

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

≫ EDIT

UE5/UE4 C++で現在のカメラと位置や角度や画角などのカメラ情報(Location、Rotation、FOVAngle)を取得する(APlayerCameraManager、GetCameraLocation、GetCameraRotation、GetFOVAngle、GetFirstPlayerController)

C++で現在のカメラと位置や角度や画角などのカメラ情報(Location、Rotation、FOVAngle)を取得する方法です。

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

・UE4 Get Camera Location or Position and Forward Vector .cpp
https://gist.github.com/sephirot47/466e29c7cded26d72ae2

BPで行っている下記のような処理をC++で書く場合ですね。

カメラの位置を取得するため「Get Camera Location」ノード。
カメラ情報000

回転を取得するため「Get Camera Rotation」ノード。
カメラ情報001

画角(FOV)を取得する「Get FOVAngle」ノード。
カメラ情報002

実際にC++ではこんな感じで取得できます。

// 現在のカメラの位置と角度と画角を取得
APlayerCameraManager* aPlayerCameraManager = GetWorld()->GetFirstPlayerController()->PlayerCameraManager;
FVector aCameraLocation = aPlayerCameraManager->GetCameraLocation(); // 位置
FRotator aCameraRotation = aPlayerCameraManager->GetCameraRotation(); // 角度
float aCameraFov = aPlayerCameraManager->GetFOVAngle(); // 画角

「GetWorld()->GetFirstPlayerController()->PlayerCameraManager」で「APlayerCameraManager」を取得します。
「APlayerCameraManager」から「GetCameraLocation」と「GetCameraRotation」と「>GetFOVAngle」で
カメラの位置と角度と画角を取得
することができます。

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

≫ EDIT

UE5/UE4 C++で列挙型(Enum)の定義名から「UEnum」型を取得する(FindObject)

C++で列挙型(Enum)の定義名から「UEnum」型を取得する方法です。

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

・[UE4] C++ で enum の foreach を行う方法
https://qiita.com/jden/items/ab4eecb899ad6c0ede52

記事内でリンクが切れているページはおそらくこちらです。

・EnumToString Macro
https://unrealcommunity.wiki/enumtostring-macro-6ukt6cyz

列挙型(Enum)の定義名からUEnum 型を取得する具体的な方法は以下のようになるようです。

enum のタイプ名から FindObject で UEnum 型のObjetを取得し、そこから情報を取っているようで、これを参考にしました。


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

・UEnum
https://docs.unrealengine.com/4.27/en-US/API/Runtime/CoreUObject/UObject/UEnum/

というわけでサンプルコードはこんな感じになりました。
まずは列挙型。

// サンプルの列挙型
UENUM(BlueprintType)
enum class EEnumSample : uint8
{
  SampleNone = 0,
  SampleOne = 1,
  SampleTwo = 2,
};

この列挙型から「UEnum」型の取得はこんな感じに。

// 列挙型の定義名
FString  aEnumTypeString(TEXT("EEnumSample"));

// 列挙型の定義名から UEnum を取得
const TCHAR*  aEnumChar = *aEnumTypeString;
UEnum* const  aEnum = FindObject(ANY_PACKAGE, aEnumChar);


これ単体で使うことはあまりなさそうですが、
他の処理と組み合わせて使うことは多そうなので覚えておきたいところでですね。

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

| PAGE-SELECT | NEXT