VR、ゲーム制作、プログラミング。Unity とか Oculus Rift とか。

2012年6月24日日曜日

[Unity]NGUIで画面サイズに合わせる

2012/8/24 追記 : 以下、おいそぎの方は [Unity]NGUIで画面サイズに合わせる(その2) の方がおすすめです。


NGUI で複数解像度対応のために、画面サイズに合わせて拡大縮小するスクリプト。

Panel に追加して、インスペクタで Base Object に画面サイズの基準となる GameObject (例えばデフォルト 1280*720 で作っているなら、そのサイズの GameObject) をドラッグ&ドロップすれば使えます。

using UnityEngine;
using System.Collections;

public class ScreenScaler : MonoBehaviour
{
    public GameObject baseObject;
    public bool aspectFit = true;
    
    void Update(){
        Vector3 ratio = new Vector3(
            Screen.width / baseObject.transform.localScale.x,
            Screen.height / baseObject.transform.localScale.y,
            1.0f
        );
        
        if(aspectFit){
            if(ratio.x > ratio.y){ ratio.x = ratio.y; }
            else if(ratio.y > ratio.x){ ratio.y = ratio.x; }
        }
        
        transform.localScale = ratio;
    }
}

起動中に画面サイズの変更がないなら、Update() でなく Start() でやってしまったほうがよいです。

Aspect Fit = true だと異なるアスペクト比のディスプレイで上下か左右が余ります。この部分の塗りつぶし色を変更したい場合は、Camera の Clear Flags を Solid Color にして Background で色を選択すれば OK です。

なお、localScale の setter の内部実装 (INTERNAL_set_localScale()) によっては、もしかすると 21 行目を

if(transform.localScale != ratio){ transform.localScale = ratio; }

と書いたほうが効率がよいかもしれませんが、小さなプロジェクトで試した範囲では違いは見られませんでした。

また、あくまで拡大縮小ですので、絵がつぶれたり粗くなったりしてしまいます。これはミップマップや HD 用画像を用意するなどして別途対処する必要があるかもしれません。


画面を引き伸ばさずに、UIAnchor + UIStretch で対応する場合の説明は NGUI 公式のドキュメント ( NGUI Example: UIAnchor » Tasharen Entertainment ) にあります。

参考:
Unity Script Reference - Transform


2012/8/24 追記 : [Unity]NGUIで画面サイズに合わせる(その2) を書きました。

0 件のコメント:

コメントを投稿