ゲーム作りが大好きな人のブログ

ゲームを作るのが大好きな人のブログ。UE4とBlender、MAYA(LT)、3DCoatを使用しています!

【UMG】【C++】オブジェクトのサイズ取得(1フレーム取得方法)

UE4.22.3で検証しています
※ 一部C++の使用が必須となります
※ 検証はテキストブロックのみとなりますが、多分全てでいけます(未検証)
※ 間違えていたらごめんなさい

UMGのオブジェクトのサイズの取得

Blueprintでの取得の場合は下記サイト様のやり方となります。
いつも丁寧な記事をありがとうございます。
全ての解説サイト様に言えますが心から感謝しております。
limesode.hatenablog.com
limesode.hatenablog.com

こちらの記事でも言及されていますが
基本的に1Tick回らないと正確なサイズは取得できません。
また恐らくですが途中でサイズを変えた場合も
その後に1Tick回らないと正確なサイズは取得できないと思います。

C++限定でサイズを計算する事が出来る模様

SWidgetにはComputeDesiredSizeという関数があり
これの戻り値がサイズを返してきます。
以下はサンプルプログラムです。

FVector2D UMyTextBlock::GetTextSize()
{
	FVector2D vSize = MyTextBlock->GetDesiredSize();

	//	キャッシュがない場合はFVector2D::ZeroVectorが返る
	if (vSize == FVector2D::ZeroVector)
	{
		return MyTextBlock->ComputeDesiredSize(1.0f);
	}

	return vSize;
}

これはUTextBlock継承したクラスにGetTextSizeという関数を実装した例です。
MyTextBlock変数のComputeDesiredSizeを呼び出せば完成です。

ちなみに上の関数の実装では正確に取得できないパターンがあると思います。
Tickが回る前にサイズ変更をし、上の関数で取得しようとすると
変更前のキャッシュしたデータを返そうとするはずです。
呼び出す回数が少ないのであれば

FVector2D UMyTextBlock::GetTextSize()
{
	return MyTextBlock->ComputeDesiredSize(1.0f);
}

が一番安全です。
※ただし、ちょっとだけ重くなると思います。

Blueprintで使いたい場合

何時頃になるかまだ分かりませんが別記事としてさっくりとまとめていこうかと思います。