LoginSignup
4

More than 5 years have passed since last update.

uGUIのImageでPixelsPerUnitを変更した時の動的な処理

Last updated at Posted at 2017-09-14

はじめに

uGUIで詰まったことがあったので、備忘録として初投稿です。
uGUIでUI画像のPixel数が大きすぎてPixelPerUnitを変更することがあると思います。
その時にwidth/heightとの関係性を残したいと思います。

PixelsPerUnitとは?

PixelsPerUnitとは、ワールド空間の1単位分のpixel数になります。
デフォルトは100に設定されています。

PixelsPerUnit.png

上のようにSpriteのインスペクタから変更することができます。

どんな時に使うの?

今回はUIをスライスして上の部分を固定化したい時に変更しました
あらかじめSpriteのインスペクタから固定化したい部分を設定しておきます。

9-Slice.mov.gif

PixelsPerUnit.mov.gif

上のように固定化したい部分の幅を変更したい場合、
PixelsPerUnitを変更するのが有効だと思います。

スクリプトから動的にUIを変更する

PixelsPerUnitはReadOnlyのため、動的に変更することはできないようです。
ただ、PixelsPerUnitを変更した時に、UIの配置を動的に処理することはできます。

UIScript.cs
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を代入しています。

最後に

たまたま数字を入れて計算したところ分かった結果なので、
もし間違っていたらコメントをいただけると嬉しいです。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4