皆様、こんばんは!
最近 Twitter では呟いてなかったですが、少し C++ を触っておりました。またやること増やして...とは思ったんですがどうしてもやってみたかったことがあって触ってみました。
自分なりに便利そうな関数を実装してまとめてみようと思い、出来ればプラグインにしたりなど、とりあえずよく分からないなりに進めてみようかなと。
※注: 意味不明なことを書いている可能性があります
四則演算
これは1年前にチャレンジしたものですが、四則演算を元々ある Increment Int のようにノード1個で更新するものを作成してみました。画像は Integer型ですが、Float型も用意しました。
できれば Add Pin をサポートしたいと思うのですが、まだ調べれてないので後日確認予定です。
引数に参照渡しを使う場合は UPARAM(ref) を付ける必要があります。
公式:ゲームプレイ要素をブループリントに公開する
「実行可能な関数およびオーバーライド可能な関数」に
関数シグネチャを作成する場合、リファレンスでパラメータ パスを作成すると、それがブループリント ノード上の出力ピンになることに注目してください。リファレンスでパラメータ パスを作成するには、 UPARAM() マクロを使います。
という記述と一緒にサンプルコードが記載されています。
配列の昇順/降順ソート
使うかわからないですが、配列内をソートするための関数です。Ascending フラグが True で昇順、False で降順になります。
公式:TArray:Unreal Engine における配列
配列は TArray を利用するようです。
TArray::Sort は引数なしの場合、デフォルトで昇順になるようです。
降順の指定方法がよくわからなかったのですが、TArray::Sort の項目(ソート)を見ると、文字列同士の長さを比較しているサンプルがあったので Intger型で置き換えてみました。
一応出力結果は大丈夫そうな感じでしたが、C言語では見たことない記述な上、合ってるのかどうかよく分かってないという...
こういう書き方はラムダ式と呼ばれているようでした。
平均値
引数で Integer型の配列を受け取り、その平均値を返す関数です。
配列内を全部足して、最後に要素数で割れば平均値になりそうなのでこんな感じにしました。
配列の長さは C++ だと Length ではなく、Num みたいです。
DateTime - DateTime
※ 若干挙動が怪しいので注意ですが、とりあえずメモ書き
日付と時間を DateTime構造体 で返す「Now」という関数があります。
開始時間を「Now」で取得して変数に保存し、終了時間との差分を求めれば時間の計測などに使える便利な関数ですが、UE5 だとバグがあるみたいで Unreal Engine Issues に報告が上がっています(UE5.3 で修正されるようですね)
上記画像のように「Now」から引っ張り、減算ノードの入力ピンに繋いだ時点で、DateTime構造体 からTimespan構造体 に変換されてしまうようで、これがバグになってるそうです。
公式:FDateTime から "Operators" の - 演算子 の項目を見ると、
FDateTime - FDateTime を FTimespan で返すものがあったのでこれも関数にしてみました。
それぞれの構造体は下記ヘッダにあるそうです。#include "Misc/DateTime.h" #include "Misc/Timespan.h"
試しに「Delay」の開始前に「Now」で取得した値を変数へ保存し、画像のように5秒後この値を出力すると4が返り、10秒を指定すると9が返ってきたので -1秒されてるようでした。
UE4 ではバグがなく普通に使えるそうなので、挙動の確認をしてみましたが、UE4 でも -1秒 された値が出てたので多分大丈夫ということにしました。
二つの差分を秒で返すという関数を作成してみました。分や時間、ミリ秒も作成。結果も同じだったので一旦よしとしました。
これも後日可能なら Add Pin をサポートしてみようと思います。
今のところ何かの値同士を計算するくらいしか行ってないんですが、かなり難しいですね...ややこしいというか、記述が独特というか...
前よりちょっとだけ理解は出来たような気はするので少し前進です。