fc2ブログ

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

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

2023年03月 | ARCHIVE-SELECT | 2023年05月

| PAGE-SELECT |

≫ 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 C++で文字列を画面とログの両方に表示する(UKismetSystemLibrary::PrintString)

C++で文字列を画面とログの両方に表示する方法です。

といってもBPでよく使っている「PrintString」をC++から実行するだけのメモになります。
C++で「PrintString」を使う場合「UKismetSystemLibrary::PrintString」関数を使います。

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

・UKismetSystemLibrary::PrintString
https://docs.unrealengine.com/4.27/en-US/API/Runtime/Engine/Kismet/UKismetSystemLibrary/PrintString/
微妙に古い…。

実際の記述はこんな感じになります。

// Include
#include "kismet/KismetSystemLibrary.h"

// 文字列を画面とログの両方に表示する
FString aString("C++でPrintString")
FLinearColor aColor(0.0f, 0.5f, 1.0f, 1.0f);
UKismetSystemLibrary::PrintString(WorldContextObject, aString, true, true, aColor, 5.0f, NAME_None);

「WorldContextObject」には「WorldContextObject」を指定します。
「InString」には「表示したい文字列」を指定します。
「bPrintToScreen」には「画面上に表示するかどうか」を指定します。
「bPrintToLog」には「ログに表示するかどうか」を指定します。
「TextColor」には「文字列のカラー」を指定します。
「Duration」には「表示時間」を指定します。
「Key」には「キー」を指定します。

実行してみた結果がこちら。
プログラムでPrintString000
問題なく表示されているようです。

あまりC++からは使わない気もしますが、念のため覚えておいた方が良いかなというところでしょうか。

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

≫ EDIT

UE5/UE4 C++でコンストラクションスクリプト(Construction Script)を使ってアクター(Actor)のラベル名を変更する(SetActorLabel)

C++でコンストラクションスクリプト(Construction Script)を使ってアクター(Actor)のラベル名を変更する方法です。

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

・[UE4] アクターのラベル名を自動変更する機能の実装方法
https://historia.co.jp/archives/14654/

アクター(Actor)のラベル名を変更するには「SetActorLabel」関数を使うようです。
というわけでコンストラクションスクリプト(Construction Script)を使ってラベル名を変更してみます。

// コンストラクション
void AActor::OnConstruction(const FTransform& Transform)
{

Super::OnConstruction(Transform);
#if WITH_EDITOR
// ラベル名変更
FString aLabelString = FString("NewActorLabelName");
this->SetActorLabel(aLabelString);
#endif
}


これでアクターのラベル名を変更することができました。

何かしらの規則に従ったラベル名にしたいなどがある場合は使う機会があるのかなと思います。

注意点としては以下のようなことがあるようです。

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

≫ EDIT

UE5/UE4 C++でコンストラクションスクリプト(Construction Script)を実行する(OnConstruction)

C++でコンストラクションスクリプト(Construction Script)を実行する方法です。

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

・【UE4】ConstructionScriptについて【★★】
https://kinnaji.com/2021/02/09/aboutconstructionscript/

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

・コンストラクション スクリプト(Construction Script)
https://docs.unrealengine.com/4.27/ja/ProgrammingAndScripting/Blueprints/UserGuide/UserConstructionScript/

というわけで、実際に「コンストラクションスクリプト(Construction Script)」を実行するためのクラスを作成します。

// コンストラクションスクリプト(Construction Script)を実装するクラス
class ANewActor : public AActor
{

GENERATED_BODY()
public:
// コンストラクタ
ANewActor ();
public:
virtual void BeginPlay() override;
virtual void EndPlay( const EEndPlayReason::Type EndPlayReason ) override;
virtual void Tick( float DeltaTime ) override;
// コンストラクション
virtual void OnConstruction(const FTransform& Transform) override;
};

このクラスの「OnConstruction」という関数がコンストラクションスクリプトに該当します。

実体の方はこんな感じになります。

// コンストラクション
void ANewActor ::OnConstruction(const FTransform& Transform)
{

Super::OnConstruction(Transform);
#if WITH_EDITOR
// エディタのみで実行される処理など
#endif
}


これでコンストラクションスクリプトを実行する処理は完了です。
アクターに変更が起きた場合に自動で何かしたいなど結構ありそうなので、色々と使えるのかなと思います。

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

≫ EDIT

UE5/UE4 変数に対してインクリメント(Increment )やデクリメント(Decrement )を一つのノードで行う(Increment Int、Decrement Int、Increment Float、Decrement Float、++、--)

変数に対してインクリメント(Increment )やデクリメント(Decrement )を一つのノードで行う方法です。

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

・【UE4・UE5】〈Tips〉諦めないで!分かりづらいブループリントノード集&知ってると幸せになれる小技
https://namiton.hatenablog.jp/entry/2022/09/15/144430#%E3%82%A4%E3%83%B3%E3%82%AF%E3%83%AA%E3%83%A1%E3%83%B3%E3%83%88%E3%83%87%E3%82%AF%E3%83%AA%E3%83%A1%E3%83%B3%E3%83%88

変数に対してインクリメント(Increment )やデクリメント(Decrement )を一つのノードで行うには
「Increment Int」「Decrement Int」「Increment Float」「Decrement Float」ノード
を使います。
インクリメントデクリメント000
「Int」と「Float」二つの型が対応しているようです。

使い方はこんな感じです。

インクリメント。
インクリメントデクリメント003
変数へのセットも行うので「+= 1」が実行されているものになります。

デクリメント。
インクリメントデクリメント004
変数へのセットも行うので「-= 1」が実行されているものになります。

上記ノードは「++」キーや「--」キーで出すことができます。

「++」キーだとこんな感じに。
インクリメントデクリメント001

「--」キーだとこんな感じに。
インクリメントデクリメント002

BPのノードをすっきりさせるためにもこういった機能は使っていきたいですね。

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

≫ EDIT

UE5/UE4 データテーブル(Data Table)アセットを「CSV」ファイルとして出力する(Export as CSV)

データテーブル(Data Table)を「CSV」ファイルとして出力する方法です。

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

・[UE4] CSVファイル出力機能が用意されている箇所について
https://qiita.com/EGJ-Kaz_Okada/items/ab5b21b6c5ad861d4987

UE4でCSVといったらまず思いつくのがDataTable!アセットの右クリックメニューから入出力が可能です。
https://docs.unrealengine.com/ja/Gameplay/DataDriven/index.html
また、類似の機能である CurveTable でも同様の操作が可能です。
http://historia.co.jp/archives/1067/

とのことです。

普通にデータテーブル(Data Table)アセットの右クリックメニューからできるようなのでやってみます。

まずはこんな感じのデータテーブル(Data Table)アセットを用意してみました。
データテーブルをCSV出力000
型の違う変数と配列を混ぜてみました。

次にデータテーブル(Data Table)アセットを右クリックででてくるメニューで
「CSVとしてエクスポート(Export as CSV)」を選択
します。
データテーブルをCSV出力001
実行すると保存ダイアログがでてくるので、ファイル名や保存先を設定してCSVファイルに保存します。

出力されたCSVファイルの中身を見てみるとこんな感じになっていました。
データテーブルをCSV出力002
無事データテーブル(Data Table)の中身がCSVファイルとして出力されたようです。

あまり使う機会はないかもしれませんが、書き戻して編集して再インポートとかもできると思いますので
ワークフローと合わせたときには使うのかなと思います。

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

≫ EDIT

UE5/UE4 2023/04 の無料マーケットプレイスコンテンツと永続コンテンツ(無料の永続コンテンツはなし)

2023/04 の無料マーケットプレイスコンテンツと永続コンテンツのメモです。

公式情報はこちら。

・2023年04月の無料マーケットプレイスコンテンツ
https://www.unrealengine.com/ja/blog/featured-free-unreal-marketplace-content-april-2023

無料コンテンツについては期日がすぎると無料でなくなるので公式情報や他のサイトさんを見たほうが良いかと思います。
こちらでは永続コンテンツについてのメモを残しておきます。

と思ったのですが2023/04は無料の永続コンテンツはないようです。残念…。
とはいえ期限ありの無料コンテンツでダウンロードできるのでそれだけでもとても助かります!

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

≫ EDIT

UE5/UE4 C++で変数をスポーン(Spawn)時に公開するようにプロパティ指定子(Property Specifiers)を使って指定する(UPROPERTY(meta=(ExposeOnSpawn=true)))

C++で変数をスポーン(Spawn)時に公開するようにプロパティ指定子(Property Specifiers)を使って指定する方法です。

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

・UE4 よく使うUPROPERTYメモ
https://qiita.com/bigengelt/items/b17545fffe7b8d69e5e8

変数をスポーン(Spawn)時に公開するには
「UPROPERTY」で「meta=(ExposeOnSpawn = true)」と指定することで実装することができます。

こんな感じの記述になります。

// スポーン時に公開
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn = true))
FVector ExposeOnSpawnLocation;


上記の指定を行うとこんな感じでスポーン(Spawn)時に公開されるようになります。
Spawn時に公開001

「SpawnActor」ノードで取得できるクラスに対して変数の変更を行っても同じ処理ができるのですが
必須で指定しないといけない情報がある場合などは、
今回のように公開して設定してもらったほうがわかりやすいのかなと思います。

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

≫ EDIT

UE5/UE4 C++で「UWorld」を持たない「UObject」を継承したクラスで「Spawn Actor from Class」ノードなどが使えるようにする(virtual UWorld* GetWorld() const)

C++で「UWorld」を持たない「UObject」を継承したクラスで「Spawn Actor from Class」ノードなどが使えるようにする方法です。

こんな感じのクラスがあるとします。

UCLASS(Blueprintable)
class UBlogClass : public UObject
{

GENERATED_BODY()
};

「UOBJECT」を継承したクラスになります。

このクラスを継承したBPを作成して「Spawn Actor from Class」を実行します。
GetWorld001.jpg
「Spawn Actor from Class」が出てこない…!?

どうも「Actor」のように「UWorld」を持たないクラスでは「Spawn Actor from Class」といったものは実行できないようです。
確かにスポーンしたところで、どのワールドに配置するの?みたいな問題がでてくるのかなと…。

とはいえ、スクリプトみたいに実態自体は特にワールドに廃止いないけれど、
「Spawn Actor from Class」が使いたい!みたいなことは普通に起きると思いますので調べてみました。

virtual UWorld* GetWorld() const override;

といった「GetWorld」関数をオーバーライドしてあげれば大丈夫のようです。

実際にやってみました。

UCLASS(Blueprintable)
class UBlogClass : public UObject
{

GENERATED_BODY()
public:
// GetWorld をオーバーライド
virtual UWorld* GetWorld() const override;
};


// GetWorld をオーバーライド
UWorld* UBlogClass::GetWorld() const
{
// 実際は nullptr では駄目です。メンバの GetWorld() などを渡してください。
return (nullptr);
}

再び「Spawn Actor from Class」ノードを呼び出してみます。
GetWorld000.jpg
無事「Spawn Actor from Class」を呼び出すことができるようになりました。

ここらへん仕組み的なものは覚えておくと、いろいろとやると思った場合に役に立つのかなと思います。

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

| PAGE-SELECT |