UI系の配置はuGUIのAutoLayoutに任せたいが、場合によってはボタンのサイズをスクリプトから変更する必要があったりする。調べてみるとRectTransform.sizeDeltaを使用すればよいみたいな記事を発見したのだが、これではうまくいかない場合もあった。
RectTransform.sizeDeltaだとどうダメか
こんな風にCanvas直下にボタンを配置してボタンのサイズを300x200に変更してみる。
Buttonに以下のスクリプトをアタッチする。
うまく行かない場合がある.cs
using UnityEngine;
using UnityEngine.UI;
public class ButtonSizeFitter : MonoBehaviour
{
void Start()
{
// ボタンのサイズを300x200に変更する
var targetSize = new Vector2(300, 200);
GetComponent<RectTransform>().sizeDelta = targetSize;
}
}
これだとButtonのアンカーがどこにあるかで結果が異なってしまう。
アンカーがボタン中央の場合
Buttonのサイズそのものが300x200に変更されてうまくいく。
アンカーが四隅の場合
Buttonのサイズが親のCanvasより大きくなってしまい、望んだ結果とは違ってしまう。
なぜこうなる
公式に書いてある。
で、どうやった解決するかと言うと、RectTransform.SetSizeWithCurrentAnchors
を使えば良いらしい。
RectTransform.SetSizeWithCurrentAnchorsで解決
SetSizeWithCurrentAnchorsを使用すると現在のアンカーの設定を考慮してサイズを変更してくれ、アンカーが中央だろうが四隅だろうが、同じ結果になった。
.cs
public class ButtonSizeFitter : MonoBehaviour
{
void Start()
{
var rtf = GetComponent<RectTransform>();
// 横方向のサイズ
rtf.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 300);
// 縦方向のサイズ
rtf.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, 200);
}
}