teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

コメントの誤りを修正

2020/03/02 00:23

投稿

Bongo
Bongo

スコア10816

answer CHANGED
@@ -22,7 +22,7 @@
22
22
  var canvasRect = rootCanvasRectTransform.rect;
23
23
  var canvasSize = canvasRect.size;
24
24
 
25
- // 下を起点とした、整数に丸めた中心座標を求め...
25
+ // 下を起点とした、整数に丸めた中心座標を求め...
26
26
  var quantizedCenter = canvasRect.min + new Vector2(Mathf.Round(canvasSize.x * 0.5f), Mathf.Round(canvasSize.y * 0.5f));
27
27
  Debug.Log(quantizedCenter.ToString("F6"));
28
28
 

1

位置調整案を追記

2020/03/02 00:23

投稿

Bongo
Bongo

スコア10816

answer CHANGED
@@ -11,4 +11,25 @@
11
11
  center.y = Mathf.Floor(center.y);
12
12
  Debug.Log(center); // ぴったり整数の位置にしてみるとどうでしょう。
13
13
  this.transform.position = center;
14
+ ```
15
+
16
+ ルートキャンバスの「[Pixel Perfect](https://docs.unity3d.com/ScriptReference/Canvas-pixelPerfect.html)」をオンにすれば端数のある座標でもくっきり表示してくれるかもしれません。
17
+ これに頼らず位置を調整するなら、たとえば下記のようなやり方はどうでしょうか?
18
+
19
+ ```C#
20
+ // まず自分が所属するルートキャンバスの矩形を取得し...
21
+ var rootCanvasRectTransform = this.GetComponentInParent<Canvas>().rootCanvas.transform as RectTransform;
22
+ var canvasRect = rootCanvasRectTransform.rect;
23
+ var canvasSize = canvasRect.size;
24
+
25
+ // 右下を起点とした、整数に丸めた中心座標を求め...
26
+ var quantizedCenter = canvasRect.min + new Vector2(Mathf.Round(canvasSize.x * 0.5f), Mathf.Round(canvasSize.y * 0.5f));
27
+ Debug.Log(quantizedCenter.ToString("F6"));
28
+
29
+ // それを自分の親の座標系に変換し、localPositionにセットする
30
+ var parentTransform = this.transform.parent;
31
+ var canvasToParentMatrix = (parentTransform != null ? parentTransform.worldToLocalMatrix : Matrix4x4.identity) * rootCanvasRectTransform.localToWorldMatrix;
32
+ var localQuantizedCenter = canvasToParentMatrix.MultiplyPoint3x4(quantizedCenter);
33
+ Debug.Log(localQuantizedCenter.ToString("F6"));
34
+ this.transform.localPosition = localQuantizedCenter;
14
35
  ```