2016-10-31 1 views
0

私はUI要素を機能させ、すべての異なる解像度で同じままにしようとしています。キャンバスにCanvas Scalerを追加し、それが終わるまで設定で遊んだ。Canvas Scalerを使用しているときにUI要素がスケーリングされない

それから、私はゲームを構築し、いくつかの異なる解像度で実行して、動作していることを確認しました。しかし、Canvas Scalerは機能していないようです。

http://prntscr.com/d1afz6

上記はいくつかのランダムな解像度であるが、それは私のエディタ画面がどのように大きいですし、それは私が私の参照解決として使用してんですよ。これは、この特定のCanvas http://prntscr.com/d1aggxの階層構造です。それは640x480で走ったときに画面全体をほぼ必要とします。なぜ私はこれが機能していないのか分からない。私はそれについて統一ガイドのほとんどを読んだことがありますが、そのうちのどれもその問題を抱えていないようです。

+0

おそらくスケーラの障害ではありません。あなたはおそらく絶対座標とサイズを使用しているでしょうが、画面のサイズによって変化しません。 –

+0

もう少し具体的で、少し詳しく説明できますか?私は、絶対座標とサイズが何を意味するのか分かりませんが、あなたはUI要素やキャンバスのプロパティについて話していますか? – mashinkata

答えて

0

いいえ、スクリーンのサイズに関係なく何かに合わせるには、Unityの絶対的なシステムとは別の座標系を使用する必要があります。ユニティのモデルの1つがビューです。ビューは左上が0,0座標、右下が1,1です。これを処理する基本的なRectを作成すると、次のようになります。

using UnityEngine; 

namespace SeaRisen.nGUI 
{ 
    public class RectAnchored 
    { 
     public float x, y, width, height; 

     public RectAnchored(float x, float y, float width, float height) 
     { 
      this.x = x; 
      this.y = y; 
      this.width = width; 
      this.height = height; 
     } 

     public static implicit operator Rect(RectAnchored r) 
     { 
      return new Rect 
      { 
       x = r.x * Screen.width, 
       y = r.y * Screen.height, 
       width = r.width * Screen.width, 
       height = r.height * Screen.height 
      }; 
     } 
    } 
} 

ここでは、通常のRectフロート、x、y座標を幅と高さとともに取ります。しかし、これらは値にある[0..1]。私はそれをクランプしないので、必要に応じて、アニメーションを使って画面上および画面上でトゥイーンすることができます。

以下は、画面の右下にボタンを作成し、画面の拡大または縮小に合わせてサイズを変更する簡単なスクリプトです。

void MoveMe() 
{ 
    RaycastHit hit; 
    if (Physics.Raycast(transform.position, -Vector3.up, out hit, float.MaxValue) 
     || Physics.Raycast(transform.position, Vector3.up, out hit, float.MaxValue)) 
     transform.position = hit.point + Vector3.up * 2; 
} 

void OnGUI() 
{ 
    if (GUI.Button(new RectAnchored(.9f, .9f, .1f, .1f), "Fix me")) 
    { 
     MoveMe(); 
    } 
} 

ボタンが下に位置する、高さと幅の画面の1/10となるように、Xは、上から右及びY 0.9から0.9であり、0.1の幅と高さ画面の1/10。

OnGUIはフレームごとにレンダリングされるので、button rectは画面のサイズを自動的に更新します。 Update()を使用してウィンドウをレンダリングしている場合、同じUIで動作します。

これは私が絶対座標で意味したものの違いを説明してくれることを願っています。前の例を640x480で(絶対値を使用して)設定すると、new Rect(576, 432, 64, 48)のようになり、縮尺は変わりません。 new RectAnchored(.9f, .9f, .1f, .1f)を使用して、画面サイズに基づいてUIスペースにレンダリングした場合、自動的に拡大縮小されます。

関連する問題