【Unity】スクリプトからRectTransformをStretchにする


概要


スクリプトから↑の状態にする方法について、エディタ拡張を書いているときに詰まったので備忘録として残します。

結論

残念ながらRectTransform.isStretch=trueのようには設定できないので、以下のようにコードでAnchorを設定します。

// 縦横Stretch
RectTransform rectTransform = (RectTransform)target.transform;
rectTransform.anchorMin = new Vector2(0, 0);
rectTransform.anchorMax = new Vector2(1, 1);

// 親オブジェクトにStretchするようにサイズを変更
rectTransform.offsetMin = new Vector2(0, 0);
rectTransform.offsetMax = new Vector2(0, 0);

解説

コードとInspectorの対応は以下のようになっています。

Inspector コード
Left offsetMin.x
Right -offsetMax.x
Top -offsetMax.y
Bottom offsetMin.y
  • anchorMin, anchorMaxのx軸, y軸について、0, 1になっている軸がStretchになる
  • offsetMax(Right, Top)はコードとInspectorの符号が反転する

おまけ

Hierarchyビューで右クリックからStretchなTextを子オブジェクトに作るサンプル


/// <summary>
/// TextMeshProを子に作成(Stretch)
/// </summary>
[UnityEditor.MenuItem("GameObject/Test/Stretched Text", false, 0)]
public static void CreateStretchText()
{
    var obj = UnityEditor.Selection.activeGameObject;
    if (obj == null)
        return;

    var target = new GameObject("Text (TMP)", typeof(TMPro.TextMeshProUGUI));
    var txt = target.GetComponent<TMPro.TextMeshProUGUI>().text = "New Text";
    target.transform.SetParent(obj.transform);

    // 縦横Stretch
    RectTransform rectTransform = (RectTransform)target.transform;
    rectTransform.anchorMin = new Vector2(0, 0);
    rectTransform.anchorMax = new Vector2(1, 1);

    // 親オブジェクトにStretchするようにサイズを変更
    rectTransform.offsetMin = new Vector2(0, 0);
    rectTransform.offsetMax = new Vector2(0, 0);
}