LoginSignup
1
0

More than 1 year has passed since last update.

【Unity】アスペクト比維持してUIのimageをCanvasにフィットさせる

Last updated at Posted at 2021-04-25

「Canvasにフィットさせる」とは?

imageのUIを、元の画像のアスペクト比そのまま、はみ出ないようにピッタリに、というイメージ。
Rect Transformを弄ってもできることはできるのだが、それだとimageがCanvasめいっぱい覆う感じになってしまうので、もう少し端に寄ってもらう方法とかないかな、と考えた次第。

1.環境について

Unityバージョン:2019.4.18f1
Visual Studio Community 2019バージョン:16.9.1

2.スクリプトですべて解決

色々とインスペクター弄るの面倒なので、アタッチして実行したら即完成するスクリプトを作った。

ImageSizeManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ImageSizeManager : MonoBehaviour
{
    private float scaleRate;
    // Start is called before the first frame update
    void Start()
    {
        this.GetComponent().preserveAspect = true;
        this.GetComponent().SetNativeSize();
        Vector2 CanvasSize = transform.root.GetComponent().sizeDelta;
        Vector2 ThisImageSize = this.GetComponent().sizeDelta;
        if(CanvasSize.x<CanvasSize.y)
        {
            scaleRate = CanvasSize.x / ThisImageSize.x;
        }
        else
        {
            scaleRate = CanvasSize.y / ThisImageSize.y;
        }
        this.GetComponent<RectTransform>().localScale = new Vector3(scaleRate, scaleRate, 1);
    }
}

3.応用編:Canvasピッタリ、から少し余裕を作りたい場合

ファイル名

上の画像は、Canvasの上下左右に10ずつ離したPanelです。まぁキッチリカッチリではなく少し離す、というのは想定される事例です。

これに対応させる場合、若干スクリプトを弄らなければなりません。とはいえ、そこまで苦でもないのですが。

一つ前の項目で少し書いた通り、このスクリプトはCanvasの縦横サイズを参照するのが基本となってます。

よって、Canvasの縦横サイズから少しずらすのならば、ずらした分だけ調整すればいいだけです。具体的にはこんな感じ。

ImageSizeManager.cs
Vector2 CanvasSize = transform.root.GetComponent().sizeDelta+new Vector2(-20,-20);

スクリプトの12行目のココ。

これがCanvasを参照している部分なので、ここからずれる分を引き算なり足し算すれば大丈夫です。

画像の例だと、私は上下左右に10ずつ余白を作ったので、縦と横、一片の長さをもとのCanvasと比較すると、(ローカル座標で)20短くなっていることがわかります。

それを引き算してスクリプトを保存、完成形はこちら。

以上です。

1
0
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
1
0