はじめに
uGUIで詰まったことがあったので、備忘録として初投稿です。
uGUIでUI画像のPixel数が大きすぎてPixelPerUnitを変更することがあると思います。
その時にwidth/heightとの関係性を残したいと思います。
PixelsPerUnitとは?
PixelsPerUnitとは、ワールド空間の1単位分のpixel数になります。
デフォルトは100に設定されています。
上のようにSpriteのインスペクタから変更することができます。
#どんな時に使うの?
今回はUIをスライスして上の部分を固定化したい時に変更しました
あらかじめSpriteのインスペクタから固定化したい部分を設定しておきます。
上のように固定化したい部分の幅を変更したい場合、
PixelsPerUnitを変更するのが有効だと思います。
#スクリプトから動的にUIを変更する
PixelsPerUnitはReadOnlyのため、動的に変更することはできないようです。
ただ、PixelsPerUnitを変更した時に、UIの配置を動的に処理することはできます。
using UnityEngine;
using UnityEngine.UI;
public class UIScript : MonoBehaviour {
void Start ()
{
// PixelPerUnitを取得
float pixelPerUnit = GetComponent<Image>().sprite.pixelsPerUnit;
// 子のRectTransformを取得
var titleRectTrans = transform.Find("Title").gameObject.GetComponent<RectTransform>();
// 子のTitleの高さを変更
titleRectTrans.sizeDelta = new Vector2(0, 237.0f * (100 / pixelPerUnit));
}
}
今回はUIの上部の大きさに合わせてTextの大きさを変更しています。
使用した画像は1920*1371の大きさで、上部の白い部分は上から237pxの範囲になります。
注意が必要なのは、1px当たりのwidth/heightは
100 / PixelsPerUnit
になる点です。
100[width] = 1[unit]
100[height] = 1[unit]
になっているせい?なのか、
100[width/unit] / PixelsPerUnit[px/unit] = 1px当たりの横幅[width/px]
100[height/unit] / PixelsPerUnit[px/unit] = 1px当たりの縦幅[height/px]
となるようです。(分かり辛かったらすいません。)
余談ですが、RectTransformのsizeDeltaにwidth/heightが格納されていています。
今回使ったTextのRectTransformは横幅をStretchしているため、横幅に0を代入しています。
#最後に
たまたま数字を入れて計算したところ分かった結果なので、
もし間違っていたらコメントをいただけると嬉しいです。