1. sango

    Posted

    sango
Changes in title
+(メモ)UMGで動的に座標を割り振られたウィジェットの座標を知る方法。
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,56 @@
+# 概要
+UE4のUMGには`VerticalBox`や`HorizontalBox`みたいな、子の座標を自動的に割り振ってくれる機能がありますが、
+これらに依って動的に割り振られた座標って子のプロパティからは取得できなくてちょっと不便な時もある気がします。
+(取得するプロパティや関数があったら教えてクレメンス!!)
+
+と言うわけで、今回は(ちょっと遠回りになりますが)その座標を調べる方法を綴ります。
+
+※検証環境は Unreal Engine 4.10.x です。
+
+# サンプル構成
+検証のためにVerticalBoxやHorizontalBoxをふんだんに使ったウィジェットを作ったよ!
+![ss_024.png](https://qiita-image-store.s3.amazonaws.com/0/97611/a8cfa1c5-dda0-4746-9b74-206eb4d2129f.png)
+
+`Target` の座標を求めるよ。
+
+# 手順
+
+今回の手法では子側の拡張が必要になるよ。
+
+## 1. Target を親ウィジェットから切り離して新規ウィジェットとして生成
+![ss_025.png](https://qiita-image-store.s3.amazonaws.com/0/97611/2850ed48-256e-8ea1-fa97-d8929b36014e.png)
+
+親ウィジェットの階層から切り取って新しいウィジェットに張り付けてね。
+
+## 2. Event Tick で 座標取得して変数に格納
+
+![ss_026.png](https://qiita-image-store.s3.amazonaws.com/0/97611/fe650ae4-2bbb-61df-40eb-0030aa5c847a.png)
+
+↑みたいに、 `Event Tick` から `Local to Viewpoint` を通して、戻り値を変数に格納してね!
+
+変数を公開すればもう完成したも同然!
+とっても簡単ね!
+
+詳しく知らないけど `Absolute to Viewport` っていう関数もあるよ。
+
+## 3. 親ウィジェットに戻って新しく作ったウィジェットを再配置
+![ss_027.png](https://qiita-image-store.s3.amazonaws.com/0/97611/c8c73133-2910-c98d-5c2d-c18c43a037a8.png)
+
+`パレット` -> `ユーザーが作成` から、さっき作ったウィジェットを選んで、 `Target` があった位置に再配置してね!
+
+# テスト
+
+## 1. 親ウィジェットから子ウィジェットの座標を参照して出力してみる
+![ss_028.png](https://qiita-image-store.s3.amazonaws.com/0/97611/88a08e3e-550b-b655-d35c-ed61d35c46a1.png)
+
+子ウィジェットで公開した変数を参照してPrintしてみるよ。
+
+## 2. できたかな?
+![ss_029.png](https://qiita-image-store.s3.amazonaws.com/0/97611/a65f86dd-f39e-da19-e611-71f7958da3cd.png)
+
+
+# 欠点
+
+- 回りくどい
+- Tickで初めて座標が更新されるので、初回(Construct)では 0,0 しか取れない
+- スクロールなどで画面外に出るとTickが呼ばれなくなるので座標が取れなくなる