fc2ブログ

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

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

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

| PAGE-SELECT | NEXT

≫ EDIT

UE5/UE4 角度の数値を 0.0 から 360.0 の間で取得する(Division(Whole and Remainder))

角度の数値を 0.0 から 360.0 の間で取得する方法です。

角度の数値を0から360の間で取得するには「Division(Whole and Remainder)」ノードを使います。
0から360度で値を取得000
「Division(Whole and Remainder)」は数値を割った回数と端数を取得するノードです。

詳しい「Division(Whole and Remainder)」ノードの使い方はこちら。

・数値を特定の数値で割った回数と端数を取得する(Division(Whole and Remainder)、Division(Whole and Remainder)to Integer64)
http://kagring.blog.fc2.com/blog-entry-644.html

というわけで実際に角度を 0.0 から 360.0 の間になるように実装してみます。
まずは「Division(Whole and Remainder)」ノードを使ってこんな感じに。
0から360度で値を取得001
取得したい角度420.0を360.0で割った端数を取得して表示してみました。

結果はこんな感じに。
0から360度で値を取得002
420.0 を 360.0 で割ったときの端数は 60.0 なので結果はあってますね。
基本的にはこれだけでよさそうです。

ただし、下記のように数値が負の値だった場合は結果は負の値になります。
0から360度で値を取得003

結果はこんな感じに。
0から360度で値を取得004
-450.0 を 360.0 で割った端数は -90.0 なので結果はあっていますね。

このままでも使えそうですが、0.0 から 360.0 の間に収まっていないのでこんな感じで補正してみました。
0から360度で値を取得005

結果はこんな感じに。
0から360度で値を取得006
-90.0 を 0.0 から 360 の間にしようとすると 360.0 - 90.0 なので 270 となり、欲しい結果になりました。

と、こんな感じで角度を 0.0 から 360.0 の間にすることができました。
できれば Branch ノードを使用しないでうまく取得できるといいのですが…。
ここらへんもまた別途調べてみたいですね。

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

≫ EDIT

UE5/UE4 C++で値(Float、Int、Bool)を「FString」型に変換する(FString::SanitizeFloat、FString::FromInt)

C++で値(Float、Int、Bool)を「FString」型に変換する方法です。

「FString」に関する公式ドキュメントはこちら。

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

上記に記載されている下記の関数を使います。

「Float」型の値を「FString」型に変換するには「FString::SanitizeFloat」関数を使います。

FString::SanitizeFloat(FloatVariable);

実際に記述するとこんな感じになります。

float aFloatValue = 1234.0f;
FString aFString = FString::SanitizeFloat(aFloatValue);


「Int」型の値を「FString」型に変換するには「FString::FromInt」関数を使います。

FString::FromInt(IntVariable);

実際に記述するとこんな感じになります。

int32 aIntValue = 1234;
FString aFString = FString::FromInt( aIntValue);


「Bool」型の値を「FString」型に変換するには…特に関数はないようです。

InBool ? TEXT("true") : TEXT("false");

できればこちらも他と同様関数を用意してほしいところですが…。

普通に変換しても難しい処理ではないのですが
「FString」型用として関数が用意されているので覚えておいて使えるようになりたいところですね。

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

≫ EDIT

UE5/UE4 C++で「FString」型を標準文字列に変換する(FString、TCHAR_TO_ANSI)

C++で「FString」型を標準文字列に変換する方法です。

かなり初歩的なことではあるのですが、
BPで普段やっていたことをC++でいざやろうと思ったときにちょっと悩んだのでメモすることにしました。

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

・【UE 4学習】22_C++出力文字列およびFstring文字列変換
https://jpdebug.com/p/372860

・UnrealC++のTips
https://qiita.com/finap/items/01ad4c4b9480935fe160

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

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

FString 型から標準文字列に変換する場合は基本的に「TCHAR_TO_ANSI」を使うようです。

// FString から標準文字列に変換
FString aFString(TEXT("Sample String"));
std::string aString = TCHAR_TO_ANSI(*aFString);


返還機能が用意されているのでわかりやすいですね。

ここらへん一度覚えればすぐになじみそうなではあるので覚えていきたいところです。

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

≫ EDIT

UE5 「Print String」や「Print Text」で同じ「Key」 を指定した文字列が多重に表示されないようにする(Print String、Print Text)

「Print String」や「Print Text」で同じ「Key」を指定した文字列が多重に表示されないようにする方法です。

こちらのツイートを拝見したの試してみました。

UE5 になって「Print String」や「Print Text」に「Key」というパラメータが追加されたようです。
PrintStringのKey000PrintStringのKey001

さっそく試してみました。
まずはこんな感じに特に「Key」に何も指定しない「None」で表示してみました。
PrintStringのKey002

結果はこんな感じに。
PrintStringのKey003
従来通りすべての「Print String」の文字列が表示されました。

次に最初と最後の「Key」には共通のものを。真ん中だけ別の「Key」を指定してみました。
PrintStringのKey004

結果はこんな感じに。
PrintStringのKey005
「HelloA」と「HelloC」の「Key」が同じなので、「HelloC」によって「HelloA」の文字列表示が上書きされました。
「HelloB」は異なる「Key」が指定されているのでそのまま表示されています。

連続で上記ノードを使った場合、画面にばーっと連続で表示されてしまうのでかなり便利なのではと思います。
「Tick」などで毎フレーム表示が確約されているものでは「Duration」を0.0にする。といった方法をとっていましたが
毎フレームではないけど結構な頻度で呼ばれるもの。についてはどうしようもなかったのでこういう機能は助かりますね。

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

≫ EDIT

UE5/UE4 C++で「FString」型を「TCHAR」型に変換する(FString)

C++で「FString」型を「TCHAR」型に変換する方法です。

かなり初歩的なことではあるのですが、
BPで普段やっていたことをC++でいざやろうと思ったときにちょっと悩んだのでメモすることにしました。

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

・【UE 4学習】22_C++出力文字列およびFstring文字列変換
https://jpdebug.com/p/372860

・UnrealC++のTips
https://qiita.com/finap/items/01ad4c4b9480935fe160

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

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

FString 型から TCHAR 型に変換する場合は基本的に以下のもので大丈夫そうです。

// FString から TCHAR
FString aFString(TEXT("Sample String"));
TCHAR* aTChar = *aFString;

// FString から const TCHAR
FString aFString(TEXT("Sample String"));
const TCHAR* aTChar = *aFString;


すごく簡単ではあるんですが、明示的な関数などがあるわけではないので最初ちょっと悩みました。

ここらへん一度覚えればすぐになじみそうなではあるので覚えていきたいところです。

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

≫ EDIT

UE5/UE4 数値を特定の数値で割った回数と端数を取得する(Division(Whole and Remainder)、Division(Whole and Remainder)to Integer64)

数値を特定の数値で割った回数と端数を取得する方法です。

割った回数と端数を取得するには以下のノードを使います。
「Division(Whole and Remainder)」
「Division(Whole and Remainder)to Integer64」
割った回数と端数を取得000
割った回数と端数を取得001
「Division(Whole and Remainder)to Integer64」はなんでしょうかこれ…。
ノードだけみると割った回数が Integer64 になっているだけのようです。
どういう状況で使うのを想定しているノードなんでしょうか…。

「Dividend」には元の値を指定します。
「Divisor」には割り算に使いたい数値を指定します。
「Remainder」は「Dividend」を「Divisor」で割った結果の端数になります。
「Return Value」は「Dividend」を「Divisor」で割ることができた回数になります。

こんな感じで処理を作ってみました。
割った回数と端数を取得002
360.0 を 70.0 で割り、割ることができた回数と端数を表示するものになります。

結果はこんな感じに。
割った回数と端数を取得003
5回割ることができ、端数は10.0となり。無事取得したい結果になりました。

こういった結構便利系のノードはまだありそうなので覚えておきたいですね。

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

≫ EDIT

UE5/UE4 カメラが切り替わった際の切り替え元の終了イベントと切り替え先の開始イベント(Event On End View Target、Event On Become View Target)

カメラが切り替わった際の切り替え元の終了イベントと切り替え先の開始イベントについてです。

カメラが切り替わった際に、切り替え元の終了イベントと切り替え先の開始イベントが下記のノードで処理できます。

切り替え元の終了イベントである「Event On End View Target」ノード。
カメラ切り替え時のイベント002
カメラが切り替わった際、切り替え元のカメラに対して行われるイベントです。
「PC」は Player Controller になります。

切り替え先の開始イベントである「Event On Become View Target」ノード。
カメラ切り替え時のイベント001
カメラが切り替わった際、切り替え先のカメラに対して行われるイベントです。
「PC」は Player Controller になります。

この二つのノードがどういったものが調べようと思ったのですが、
WEBで調べてもあ UE4 のリリースノートで少し触れられている程度であまりでてこないのですよね…。

・Unreal Engine 4.4 リリース ノート
https://docs.unrealengine.com/4.26/ja/WhatsNew/Builds/ReleaseNotes/2014/4_4/

アクタが PlayerController のビューターゲットであることを開始および停止した時に発動するアクタのためのブループリント イベントを追加しました (OnBecomeViewTarget / OnEndViewTarget)。

これらのためのネイティブの C++ イベントはすでに存在していましたが (BecomeViewTarget / EndViewTarget)、ブループリント イベントをトリガーするようになりました。

PlayerCameraManager から EndViewTarget / BecomeViewTarget を呼び出す順を変更しました。それによって、最初に End イベントが古いターゲットで発生し、続いて、新しいターゲットで Begin イベントが発生するようになりました (これまでは逆でした)。


こちらのサイトも参考にさせていただきました。

・UE4:WheeledVehicleを用いたアクターへの乗車処理
https://unrealbussan.hatenablog.com/entry/2018/11/11/175658

というわけでさっそくやってみました。

「BP_CameraActor000」と「BP_CameraActor001」という二つのカメラを配置して
各カメラのBPをこんな感じにしてみました。

BP_CameraActor000のBPはこんな感じに。
カメラ切り替え時のイベント003

BP_CameraActor001のBPはこんな感じに。
カメラ切り替え時のイベント004

あいはこんな感じでカメラを切り替える処理を書いてみました(交互にカメラの切り替えが行われる)
カメラ切り替え時のイベント000

1回実行時はこんな感じの結果に(下から順です)
カメラ切り替え時のイベント005
もともと別のカメラから「BP_CameraActor001」に切り替えているため、
「BP_CameraActor001」の「Event On Become View Target」イベントが実行されています。

2回実行時はこんな感じの結果に(下から順です)
カメラ切り替え時のイベント006
もともと別のカメラから「BP_CameraActor001」に切り替えているため、
まずは「BP_CameraActor001」の「Event On Become View Target」イベントが実行され、
2回目で「BP_CameraActor000」に切り替わるため
「BP_CameraActor001」の「Event On End View Target」がまずは実行され、
そのあとに「BP_CameraActor000」」の「Event On Become View Target」が実行されています。

3回実行時はこんな感じの結果に(下から順です)
カメラ切り替え時のイベント007
もともと別のカメラから「BP_CameraActor001」に切り替えているため、
まずは「BP_CameraActor001」の「Event On Become View Target」イベントが実行され、
2回目で「BP_CameraActor000」に切り替わるため
「BP_CameraActor001」の「Event On End View Target」がまずは実行され、
そのあとに「BP_CameraActor000」」の「Event On Become View Target」が実行されました。
3回目で「BP_CameraActor001」に再度切り替わるため
「BP_CameraActor001」の「Event On End View Target」が実行され、
最後に「BP_CameraActor000」」の「Event On Become View Target」が実行されました。

カメラ自身で自分にカメラが切り替わったか、自分から違うカメラに切り替わったが検出できるため、
複数のカメラで制御を行っているものとしてはかなりわかりやすい初期化や終了処理などが記述できそうです。

ここらへんの便利機能はもっと知っておかないとなと思いました。

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

≫ EDIT

UE5/UE4 データテーブル(Data Table)の定義名(行の名前)一覧を取得する(Get Data Table Row Names)

データテーブル(Data Table)の定義名(行の名前)一覧を取得する方法です。

「Get Data Table Row Names」ノードを使います。

・Get Data Table Row Names
https://docs.unrealengine.com/4.27/en-US/BlueprintAPI/DataTable/GetDataTableRowNames/

DataTableの名前一覧を取得000
「Table」には定義名(行の名前)一覧を取得したいデータテーブル(Data Table)を指定します。

こんな構造体のデータテーブルを作ってみました。
DataTableの値を取得003

上記の一覧を取得するために実際に使ってみるとこんな感じになります。
DataTableの名前一覧を取得001

結果はこんな感じに。
DataTableの名前一覧を取得002
無事定義名(行の名前)一覧が取得できているようです。

ゲームの実装ではあまり使わなさそうですが、デバッグ時や開発時には何か使えそうな気がします。

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

≫ EDIT

UE5/UE4 C++で自作した構造体をデータテーブル(Data Table)に設定できるようにする(FTableRowBase)

C++で自作した構造体をデータテーブル(Data Table)に設定できるようにする方法です。
※おそらくUE4でも同じ方法でいけると思うのですが、試したのがUE5だったのでUE5の記事になっています。

C++で構造体を定義する場合はこんな感じになると思います。

USTRUCT(BlueprintType)
struct FDataTableTestParam
{
  GENERATED_BODY()

public:
  UPROPERTY(EditAnywhere, BlueprintReadWrite)
  float Param = 0.0f;
};


データテーブル(Data Table)アセットを作成します。
データテーブルの構造体000

この構造体でデータテーブル(Data Table)を作ろうと思ったのですが以下のように見つかりませんでした。
データテーブルの構造体002

調べてみたところ「FTableRowBase」を継承しないといけないようでした。
なので継承して再度構造体を作ってみます。

USTRUCT(BlueprintType)
struct FDataTableTestParam : public FTableRowBase
{
  GENERATED_BODY()

public:
  UPROPERTY(EditAnywhere, BlueprintReadWrite)
  float Param = 0.0f;
};


するとこんな感じでデータテーブル(Data Table)の構造体に指定することができました。
データテーブルの構造体003

C++での記述はBPとはいろいろと勝手が違うのでちゃんと覚えてないといけないですね。

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

≫ EDIT

UE5/UE4 データテーブル(Data Table)の値を定義名(行の名前)を指定してBPで取得する(Get Data Table Row)

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

データテーブル(Data Table)から値を取得するには「Get Data Table Row」ノードを使います。

・Get Data Table Row
https://docs.unrealengine.com/4.27/en-US/BlueprintAPI/Utilities/GetDataTableRow/
DataTableの値を取得000
「Data Table」には取得したいデータのデータテーブルを指定します。
「Row Name」には取得したいデータテーブルの定義名(行の名前)を指定します。

まずはこんな感じの構造体を用意しました。
DataTableの値を取得003

このデータテーブルから「行の名前から行のデータ(Row)」を取得します。
DataTableの値を取得001
データテーブルから行を取得して、その構造体の中身を表示するとこんな感じになります。

結果はこんな感じに。
DataTableの値を取得002
無事取得できているようです。

データテーブル(Data Table)にはゲームを作るうえでかなりお世話になりそうな気がするので覚えておくと良さそうです。

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

| PAGE-SELECT | NEXT