前提・実現したいこと
UIをスクリプトで普遍的に画面中央に配置させるには、どのような方法がよいでしょうか?
UIはピボットの位置でUIの座標が変わったり、Canvas Scalerとかで何かしら座標に影響が出そうなので、
それらに影響されず、スクリプトで画面中央に配置する方法を知りたいです。
ご教示お願いします。
試したこと
シーンにUI Textを配置し、UI Textにアタッチしたスクリプトで、それぞれ下記を試してみました。
・試したこと1
C#
1 void Start() 2 { 3 this.transform.localPosition = new Vector2(0.5f, 0.5f); 4 }
localPositionの基準位置は、ピボットによって設定されると認識しています。
この方法だと、Textのピボットは(0.5, 0.5)に設定しなければならないし、
Textの全ての親オブジェクトのピボットも全て(0.5, 0.5)に設定しておかなければならないので、少し神経を使うかなと思いました。
・試したこと2
C#
1 //キャンバスのRectTransform。 2 [SerializeField] 3 RectTransform canvasRect; 4 5 void Start() 6 { 7 this.transform.position = new Vector2(canvasRect.sizeDelta.x/2, canvasRect.sizeDelta.y/2); 8 }
この方法でやると、なぜかUI Textのテキストがゲーム画面上で薄く表示されているように見えました。
あと、SerializeFieldにインスペクタでキャンバスのRectTransformをセットしているはずなのに、下記警告文が出ます。
Assets\UISample.cs(10,19): warning CS0649: Field 'UISample.canvasRect' is never assigned to, and will always have its default value null
・試したこと3
C#
1 void Start() 2 { 3 this.transform.position = new Vector2(Screen.width/2, Screen.height/2); 4 }
問題なさそうには見えましたが、何に影響されるか理解できていないです。
試したこと1~3において、どちらにしろ、UI Text自体のピボットは(0.5, 0.5)に設定しておかないとずれてしまうことがわかりました。
localPositionだけでなく、positionもピボットの位置によって、基準位置が設定されているということでしょうか?
また、UI Textにアタッチしているスクリプトにおけるthis.transformは、UI TextのRectTransformを参照できていることでしょうか?
リファレンスを見ましたが、transformはゲームオブジェクトにアタッチしているトランスフォームと書かれていて、これがRectTransformを指しているかどうかわかりませんでした。
上記調べていくうちに新たな疑問が出てきました。詳細は追記質問に書きました。
試したこと以外にも、何かおすすめの位置設定方法があれば教えていただきたいです。
追記質問
this.transformはRectTransformを本当に取得できているのかどうかわかりません。
RectTransformを取得できているはずなのに、pivotを取得しようとするとエラーになってしまうのは何故なのでしょうか?
C#
1 [SerializeField] 2 RectTransform rectTransform; 3 4 void Start() 5 { 6 Debug.Log(this.transform); // Text (UnityEngine.RectTransform) 7 Debug.Log(this.rectTransform); // Text (UnityEngine.RectTransform) 8 Debug.Log(this.transform == this.rectTransform); // True 9 Debug.Log(this.transform.pivot); // ※ エラー。 10 Debug.Log(this.rectTransform.pivot); // (0.5, 0.5); 11 }
エラーメッセージ。
Assets\UISample.cs(21,34): error CS1061: 'Transform' does not contain a definition for 'pivot' and no accessible extension method 'pivot' accepting a first argument of type 'Transform' could be found (are you missing a using directive or an assembly reference?)
追記②
・Screenで設定した場合。
C#
1 this.transform.position = new Vector2(Screen.width/2, Screen.height/2);
・TransformPointで設定した場合。
C#
1 this.transform.position = this.transform.root.TransformPoint(Vector2.zero);
両者の違いは上記コードだけです。他の設定は同じままです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/02/11 05:36
2020/02/11 06:20
退会済みユーザー
2020/02/11 09:15
2020/02/12 13:38
退会済みユーザー
2020/02/15 15:35 編集
退会済みユーザー
2020/02/29 18:51