fc2ブログ

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

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

2022年04月 | ARCHIVE-SELECT | 2022年06月

| PAGE-SELECT | NEXT

≫ EDIT

UE5/UE4 C++でアクター(Actor)が持っているコンポーネント(Component)をクラスを指定して複数取得する(Get Components)

C++でアクター(Actor)が持っているコンポーネント(Component)をクラスを指定して複数取得する方法です。

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

・AActor::GetComponents
https://docs.unrealengine.com/5.0/en-US/API/Runtime/Engine/GameFramework/AActor/GetComponents/2/

アクターが持つコンポーネントは、テンプレートを使って以下のように記述して取得することができます。

// 取得したいコンポーネントを持つアクター
AActor* aActor;

// 取得したコンポーネントを格納する配列
TArray< UActorComponent* > aActorComponents;

// アクターが持つコンポーネントを複数取得
aActor->GetComponents< UActorComponent >(aActorComponents);

// 取得したコンポーネントを処理
for(auto aComponent : aActorComponents){


// 何か処理
}

こんな感じでアクターの「GetComponents」関数を使って取得します。

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

≫ EDIT

UE5/UE4 C++でワールド座標をスクリーン座標に変換する(Project World Location To Screen、Convert World Location To Screen Location)

C++でワールド座標をスクリーン座標に変換する方法です。

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

・[Help] How to convert World Space to Screen space? C++
https://www.reddit.com/r/unrealengine/comments/68kwhr/help_how_to_convert_world_space_to_screen_space_c/

BPでは「Convert World Location To Screen Location」ノードを使って変換します。
ソースでスクリーン座標取得000

これと同じ処理をしたいので上記ノード名で検索したのですが存在せず…。
ということで調べたら参考サイトにあるように、BPとは異なる関数名で存在していました。

C++でワールド座標をスクリーン座標に変換するには「Project World Location To Screen」関数を使います。
記述的にはこんな感じになります。

#include "Kismet/GameplayStatics.h"

// Player Controller の取得
APlayerController* aPlayerController = UGameplayStatics::GetPlayerController(this, 0);

// ワールド座標をスクリーン座標に変換
FVector aWorldLocation;
FVector2D aScreenLocation;
aPlayerController->ProjectWorldLocationToScreen(aWorldLocation, aScreenLocation);

「APlayerController」を取得し「ProjectWorldLocationToScreen」関数を使って変換します。
ワールド座標の「FVector aWorldLocation」が、スクリーン座標「FVector2D aScreenLocation」に変換されます。

同じ処理はできたのですが、名称が違うと混乱するんですよね…。

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

≫ EDIT

UNREAL FEST EXTREME 2022 SUMMER

UNREAL FEST EXTREME 2022 SUMMER が開催されたのでメモです。

公式サイトはこちら。

・UNREAL FEST EXTREME 2022 SUMMER
https://unrealengine.jp/unrealfest/extreme2022summer/

というわけで資料をぺたり。
再生リストはこちらにあるようです。

・UNREAL FEST EXTREME 2022 SUMMER(Youtube)
https://www.youtube.com/playlist?list=PLr_Cbd4sUDTxsGqpTyasfI1yRzY5Uy8CE

講演アーカイブのページはこちら。

・UNREAL FEST EXTREME '22 SUMMER
https://www.unrealengine.com/ja/events/unreal-fest-extreme-2022-summer

・インディーゲーム「くちなしアンプル」「マヨナカ・ガラン」制作事例


・グラフィニカのUE4映像制作のツール・ワークフローの裏側紹介!



「アイドルマスター スターリットシーズン」におけるグラフィックス実装事例と最適化事例



・Unreal Engineによる自動運転シミュレーション環境の構築



・サイバーコネクトツー エフェクト開発事例


・日本初Pixel Streamingを使用したwebサービスの開発事例



・「真・女神転生Ⅴ」における開発事例紹介


・Unreal Engine 5.0 ノンゲーム向け機能紹介



・Ghostwire: Tokyo™開発事例:ノンリニアな東京の街を表現する



・インカメラVFXの撮影が大河ドラマでいかに実現したか?そして今後のこの技術の可能性はいかに?

上記「インカメラVFXの撮影が大河ドラマでいかに実現したか?そして今後のこの技術の可能性はいかに?」は
動画が下記の直接でないと見れないようです(埋め込み不可?)
https://www.youtube.com/watch?v=HXU6ETWse8A

・「アンリアルクエスト3 ~グレイマンとつくる5つのショー~」


・アンリアルクエスト3 解答動画一覧
https://www.youtube.com/playlist?list=PLOl395n42WiPStTKYrsxiH067IpBNdyVV

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

≫ EDIT

UE5 C++でのPROPERTY変数のポインタの扱いについて(TObjectPtr)

C++でのPROPERTY変数のポインタの扱いについてのメモです。

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

・Unreal Engine 5 への移行ガイド
https://docs.unrealengine.com/5.0/ja/unreal-engine-5-migration-guide/

上記ドキュメントにあるこの記述になります。

・C++ オブジェクト ポインタのプロパティ

UE5 では、エディタ ビルドでの生オブジェクト ポインタのオプションの代わりとして、
テンプレートベースの 64 ビット ポインタ システムである TObjectPtr が導入
されています。
このシステムは、エディタ ビルドでは動的解決とアクセス トラッキングを追加し、
非エディタ ビルドでは生ポインタと同じ操作を実行します。
TObjectPtr 変数も、関数に渡されるとき、またはローカル変数に格納されるときに、自動的に生ポインタに変換されます。
これまで UPROPERTY 変数の生ポインタを使用していたエンジン クラスの多くは、TObjectPtr を使用するようになります。
TObjectPtr 型とのインタラクションのほとんどは暗黙的に生のポインタに変換されますが、
エンジン クラスのメンバー変数との直接のインタラクションは稀なケースとして
生のポインタのセマンティクスから TObjectPtr のセマンティクスに変更する必要があります。
たとえば、AActor の RootComponent プロパティは
UE4 では USceneComponent* でしたが、UE5 では TObjectPtr です。
USceneComponent* 戻り値型を持つ GetRootComponent への呼び出しは常にそのままにしておくことができますが、
RootComponent との直接の対話については更新が必要な場合があります。

UPROPERTY 変数のポインタ変数「TObjectPtr」を使用することが推奨されているということのようです。

オプションとして、 UCLASS 型と USTRUCT 型にある UObject ポインタのプロパティや
コンテナクラスには T* よりも TObjectPtr の使用をお勧めします。
TObjectPtr は非エディタ ビルドの生ポインタに変換するため、
出荷された製品の動作やパフォーマンスには影響しませんが、
エディタ ビルドでの開発時のエクスペリエンスが向上する
可能性があります。
以下の方法で、プログラミング スタイルをこの新しいポインタ システムに適応させることができます。

・コンテナ関数の「Find」ファミリーを呼び出す場合は、T** ではなく TObjectPtr* を使用して戻り値を取得します。

・生ポインタ コンテナによる範囲ベースのイテレーション処理は、
イテレータ変数の型として auto* を使用している可能性があります。これらを auto& に変更します。
また、TObjectPtr は解決されたオブジェクト アドレスをキャッシュできるため、
将来のアクセス試行時間の節約になるため、新しいコードでは auto& または const auto& の使用をお勧めします。

・生ポインタが必要で、暗黙の変換ができない場合は、TObjectPtr で ToRawPtr または Get を呼び出します。
一般的なケースとしては、三項演算や const_cast の内部などがあります。
関数デリゲートにパラメータを渡す場合は、パラレル デリゲート関数をパススルーとして宣言し、
生ポインタを TObjectPtr パラメータで置き換えます。以下は、パススルー デリゲート関数の例です。

非エディタ ビルドでは生ポインタと同じ動作をするので速度的にも問題ないよ。ということのようですね。

// Original function signature, using raw pointers, which we will use in most cases:
// オリジナルの生ポインタで引数を扱う関数
static bool MyFunction(UObject* FirstParameter);

// In rare cases where implicit conversion is not available, use this pass-through function.
// Pass-through function signature, using TObjectPtr:
// TObjectPtr を使った引数の記述
static bool MyFunction(TObjectPtr FirstParameter);

// Pass-through function body (in the source file):
// TObjectPtr から生ポインタの取得
bool UMyClass::MyFunction(TObjectPtr FirstParameter)
{
return ShouldShowResetToDefault(FirstParameter.Get());
}

基本的には「TObjectPtr」を使うということで問題なさそうですね。

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

≫ EDIT

UE5/UE4 C++で列挙型(Enum)を使って複数の出力(実行)ピンを持つように関数指定子(UFunction)で指定する(UFUNCTION(meta = (ExpandEnumAsExecs)))

C++で列挙型(Enum)を使って複数の出力(実行)ピンを持つように関数指定子(UFunction)で指定する方法です。

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

・UE4 C++で作ったBPの実行ピンや出力ピン、戻り値を複数にする方法メモ
https://tamfoi.hatenablog.com/entry/2016/06/02/095807

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

・メタデータ指定子(Metadata Specifiers)
https://docs.unrealengine.com/4.26/ja/ProgrammingAndScripting/GameplayArchitecture/Metadata/

列挙型(Enum)を使って複数の出力(実行)ピンを持つには、メタデータ指定子(Metadata Specifiers)を使います。

まずは列挙型(Enum)を作成します。

UENUM(BlueprintType)
enum class EDebugTestEnum : uint8
{

One = 0,
Two = 1,
Three = 2,
Count = 3 UMETA(Hidden),

};

「UMETA(Hidden)」はBP側では見えないようにするための記述になります。

上記の列挙型(Enum)を使って複数の出力(実行)ピン関数を作成します。
関数を宣言する時にこんな感じでメタデータ指定子を宣言してあげます。

UFUNCTION(BlueprintCallable, meta = (ExpandEnumAsExecs = "DebugTestEnumOutput"))
void ExecEnumOutput(EDebugTestEnum& DebugTestEnumOutput);

「meta = (ExpandEnumAsExecs = "DebugTestEnumOutput")」というメタデータ指定子の宣言
「DebugTestEnumOutput」という名称の引数は、列挙型(Enum)を使った複数ピンになる。というものです。
上記名称の引数の型は列挙型(Enum)を指定してあげます。
引数に「&」を付けているので参照となり出力ピンとなります。

公式ドキュメントのメタデータ指定子にはこう説明されています。

ExpandEnumAsExecs="Parameter"
BlueprintCallable 関数で、ある入力実行ピンがパラメータが使用する enum で
各エントリに対して作成されることを示します。
パラメータは、UENUM タグを持つ列挙型である必要があります。


上記で作られた関数はこんな感じになりました。
メタデータ指定子001
無事列挙型(Enum)の数だけ出力(実行)ピンがある関数が作成されました。
「Count」については「UMETA(Hidden),」を指定しているため非表示となっています。

使う機会は少ないかもしれませんが、必要な時に迷いそうな気もするので覚えておきたいですね。

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

≫ EDIT

UE5/UE4 C++で列挙型(Enum)を使って複数の入力(実行)ピンを持つように関数指定子(UFunction)で指定する(UFUNCTION(meta = (ExpandEnumAsExecs)))

C++で列挙型(Enum)を使って複数の入力(実行)ピンを持つように関数指定子(UFunction)で指定する方法です。

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

・UE4 C++で作ったBPの実行ピンや出力ピン、戻り値を複数にする方法メモ
https://tamfoi.hatenablog.com/entry/2016/06/02/095807

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

・メタデータ指定子(Metadata Specifiers)
https://docs.unrealengine.com/4.26/ja/ProgrammingAndScripting/GameplayArchitecture/Metadata/

列挙型(Enum)を使って複数の入力(実行)ピンを持つには、メタデータ指定子(Metadata Specifiers)を使います。

まずは列挙型(Enum)を作成します。

UENUM(BlueprintType)
enum class EDebugTestEnum : uint8
{

One = 0,
Two = 1,
Three = 2,
Count = 3 UMETA(Hidden),

};

「UMETA(Hidden)」はBP側では見えないようにするための記述になります。

上記の列挙型(Enum)を使って複数の入力(実行)ピン関数を作成します。
関数を宣言する時にこんな感じでメタデータ指定子を宣言してあげます。

UFUNCTION(BlueprintCallable, meta = (ExpandEnumAsExecs = "DebugTestEnumInput"))
void ExecEnumInput(EDebugTestEnum DebugTestEnumInput);

「meta = (ExpandEnumAsExecs = "DebugTestEnumInput")」というメタデータ指定子の宣言
「DebugTestEnumInput」という名称の引数は、列挙型(Enum)を使った複数ピンになる。というものです。
上記名称の引数の型は列挙型(Enum)を指定してあげます。

公式ドキュメントのメタデータ指定子にはこう説明されています。

ExpandEnumAsExecs="Parameter"
BlueprintCallable 関数で、ある入力実行ピンがパラメータが使用する enum で
各エントリに対して作成されることを示します。
パラメータは、UENUM タグを持つ列挙型である必要があります。


上記で作られた関数はこんな感じになりました。
メタデータ指定子000
無事列挙型(Enum)の数だけ入力(実行)ピンがある関数が作成されました。
「Count」については「UMETA(Hidden),」を指定しているため非表示となっています。

使う機会は少ないかもしれませんが、必要な時に迷いそうな気もするので覚えておきたいですね。

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

≫ EDIT

UE5/UE4 C++で開発のみ(DevelopmentOnly)の関数を関数指定子(UFunction)を使って作成する(UFUNCTION(meta = (DevelopmentOnly)))

C++で開発のみ(DevelopmentOnly)の関数を関数指定子(UFunction)を使って作成する方法です。

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

・メタデータ指定子(Metadata Specifiers)
https://docs.unrealengine.com/4.26/ja/ProgrammingAndScripting/GameplayArchitecture/Metadata/

開発のみ(DevelopmentOnly)の関数を作成するには、メタデータ指定子(Metadata Specifiers)を使います。

関数を宣言する時にこんな感じでメタデータ指定子を宣言してあげます。

UFUNCTION(BlueprintCallable, meta = (DevelopmentOnly))
void FunctionDevelopmentOnly();

「meta = (DevelopmentOnly)」がメタデータ指定子の宣言になります。

上記のように関数を定義することで関数が「開発のみ(DevelopmentOnly)」となります。
メタデータ指定子003
無事「開発のみ」という表示がされています。

公式ドキュメントのメタデータ指定子にはこう説明されています。

DevelopmentOnly
DevelopmentOnly とマーク付けされている関数は Development モードでのみ実行します。
出荷する製品には存在しないデバッグ出力のような機能で役立ちます。


リリース時には使わない処理などは結構あると思うので、こういったものを活用していきたいですね。

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

≫ EDIT

UE5/UE4 BP(Blueprint)で構造体(USTRUCT)の特定のメンバ変数にだけ値をセットする(Set members in、Restore all strcture pins、Remove all other pins、Remove this struct Variable pin)

BP(Blueprint)で構造体(USTRUCT)の特定のメンバ変数にだけ値をセットする方法です。

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

・Blueprintで構造体のメンバ変数の値を設定する方法
https://nofu.jp/wiki/blog/2016/2016-04-07

まずはこんな感じの構造体(USTRUCT)を用意しました。

USTRUCT(BlueprintType)
struct FDebugStruct
{

//
GENERATED_BODY()
public:
//
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Debug Struct")
float Value0 = 0.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Debug Struct")
float Value1 = 0.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Debug Struct")
float Value2 = 0.0f;
};

上記構造体のメンバ変数の特定の値のみをBPで変更していきます。

まずはBPで構造体を取得して「Set members in XXX」を選択します。
構造体のメンバ一つに値をセット000

するとこんな感じで構造体の値をセットするノードが出現します。
構造体のメンバ一つに値をセット001

このままだと構造体丸ごとに対してとなってしますので
「Restore All Structure Pins」を選択してすべてのメンバを出現させます。
構造体のメンバ一つに値をセット002

するとこんな感じで構造体のすべてのメンバ変数が出現します。
構造体のメンバ一つに値をセット003
これにこのまま値をセットすればいいのですが、
状況によっては(そういう場合の方が多いと思いますが)特定の変数のみ書き換えたいという状況があると思います。

そういった場合は、まず書き換えたい変数の値を変更します。
構造体のメンバ一つに値をセット004
今回は「Value1」だけ書き換えたいと思います。

次に、書き換えたい変数のピンを右クリックして「Remove All Other Pins」を選択します。
構造体のメンバ一つに値をセット005

するとこんな感じで、選択したピン以外の値へのセットピンがなくなります。
構造体のメンバ一つに値をセット006
これで変数「Value1」のみ書き換えることができました。

上記1つ以外に複数の特定の変数だけ書き換えたい。ということもあると思います。
この場合は、書き換えたくない変数のピンを右クリックして「Remove this struct Variable pin」を選択します。
構造体のメンバ一つに値をセット007

するとこんな感じで、選択したピンがなくなり、セットする処理から外れます。
構造体のメンバ一つに値をセット008

こういった感じで、「Remove all other pins」と「Remove this struct Variable pin」を使い分けるのがよさそうです。

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

≫ EDIT

UE5/UE4 C++でBPのノード処理と同じ処理を実装するために調べる(Goto Definition)

C++でBPのノード処理と同じ処理を実装するために調べる方法です。

UE5/UE4 のC++を学んでいると、BPのノード名とC++の関数名が異なることが結構多いことがあります。
これが結構手間になっていたので、それに関する方法です。

こういう方法を教えていただきました。

確かに普通にBPのノードをダブルクリックでいけそうですね。

「Convert World Location To Screen Location」というノードがあります。
ソースでスクリーン座標取得000

これがC++でどう実装されているかを確認するためにノードをダブルクリックしてみます。
ソースでスクリーン座標取得001
こんな感じで実際のC++で処理されている場所を開くことができました。

どうもBPの「Convert World Location To Screen Location」ノードは
C++では「ProjectWorldToScreen」関数として実装されているようです。

なので、C++では「ProjectWorldToScreen」を使って実装するのがよさそうです。

ダブルクリックではなく「Goto Definition」でも同じくソースコードを開けるようです。

余談ですがC++の関数名の「Project World to Screen」はBPのノードにもあるようです。
ソースでスクリーン座標取得002
これは実際どっちを使うのがいいのでしょうか…。

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

≫ EDIT

UE5/UE4 C++でBPに公開する関数の入力(引数)を参照として受け取る(UPARAM(ref))

C++でBPに公開する関数の入力(引数)を参照として受け取る方法です。

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

・【UE5】BP公開の関数のパラメーターを参照だけど入力として扱いたい場合
https://shuntaendo.hatenablog.com/entry/2022/04/01/223000

関数の引数の定義の前に「UPARAM(ref)」を記述するだけで問題なさそうです。
通常だとこんな感じの関数を定義すると

UFUNCTION(BlueprintCallable)
void GetRefValue1(int32& Value1);

BPでこうなります。
入力を参照として受け取る000
戻り値(返り値)になってしまいますね。

これを引数の定義の前に「UPARAM(ref)」を付けてみます。

UFUNCTION(BlueprintCallable, BlueprintPure)
void GetRefValue2(UPARAM(ref) int32& Value1);

入力でなおかつ参照で受け取れるようになりました。
入力を参照として受け取る001

複数の入力を参照で受け取りたい場合も同様に記述を増やすだけで問題なさそうです。

UFUNCTION(BlueprintCallable, BlueprintPure)
void GetRefValue3(UPARAM(ref) int32& Value1, UPARAM(ref) int32& Value2);

参照での入力が複数になりました。
入力を参照として受け取る002

C++でやろうとすると案外わからなかったりするので、こういうのは覚えておきたいですね。

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

| PAGE-SELECT | NEXT