web-dev-qa-db-ja.com

異なる画面解像度での作業方法

ゲームにUnity 4.3.3を使用しています。 AndroidおよびiOSデバイス用のゲームを作成しています。私は結束が初めてなので、異なる画面解像度で作業する方法を見つけることができないようです。スクリプトにc#を使用しています。

ゲームを全画面で実行したい。 iPad 2でテストしたところ完璧に動作しますが、iPhone 4では側面がクリップされ、iPhone 5ではさらにクリップされます。解決策は何ですか? [プレーヤーの設定]> [iOS]> [その他の設定]> [ターゲットの解像度]でどのオプションを選択する必要がありますか?

51
Ashish Beuwria

unityは、使用している画面のアスペクト比の寸法に合わせてゲーム内カメラを変更します。明らかにこれは常に望ましいとは限らないので、これを回避する方法がいくつかあります。

1)最初の方法は非常に簡単に実装できますが、見栄えはめったにありません。ゲームのデザインに合わせてカメラのアスペクト比を変更するだけです。たとえば、4:3でゲームを設計した場合、次のようになります。

Camera.aspect = 4f/3f;

これにより、異なるアスペクト比でゲームが歪むことに注意してください。

2)他の方法はもう少し複雑ですが、結果はずっと良く見えます。正射投影カメラを使用している場合、使用する画面解像度に関係なく、正射投影カメラは高さを設定値に保ち、幅のみを変更することを覚えておいてください。たとえば、サイズが10の正射投影カメラの場合、高さは2に設定されます。これを念頭に置いて、各レベル内で可能な限り広いカメラを補正する必要があります(たとえば、より広い背景を持つ)または、作成した幅にカメラの幅が一致するまで、カメラの正投影サイズを動的に変更します。

GUIコンポーネントは、必要に応じて画面解像度に依存するように位置を設定するだけで、実装が簡単になります。たとえば、右上隅にボタンを表示する場合は、その位置をposition = new Vector2(Screen.width - 50, 50);などのように設定するだけです

編集:使用したデバイスについて言及したので、それぞれが使用するアスペクト比を見つけるために少し調べました:Ipad2 = 4:3、Iphone4 = 3:2、およびIphone5 = 16:9

Ipad2で完璧に見えると言ったので、4:3のアスペクト比を使用するようにゲームを設計したのではないかと思います。解決策は、上記の2つの方法のいずれかを使用することです。

Unity Editor内の各デバイスでどのように表示されるかは、かなり簡単に確認できます。ゲームタブに移動すると(ユニティエディタで再生ボタンを押すとポップアップ表示されます)、デバイス名と解像度およびアスペクト比が表示されます。これを変更すると、異なるアスペクト比でどのように見えるかがわかります。

39
Steven Mills

Camera.ScreenWidthとCamera.ScreenHeightを使用して、デバイスの解像度をキャプチャしてみてください。

次に、計算を行って、現在の解像度との差を計算し、それを親オブジェクトに適用します。

これにより、さまざまな解像度のデバイスに複数の画像解像度などを持たせることなく、デバイスの解像度に合わせてすべてを拡大/縮小します。

4
KennethLJJ

デバイスのアスペクト比に従ってカメラのビューポートを変更する必要があります。 720x1080用のゲームを作ったとします

次に、スクリプトで行う必要があります

float xFactor = Screen.width / 720f;
float yFactor = Screen.height  / 1080f;

Camera.main.rect = new Rect(0,0,1,xFactor/yFactor);

または

別の方法は、アスペクト比9:16のゲームを作成している場合、

スクリプトでこれを行い、

public float targetRatio = 9f/16f; //The aspect ratio of your game
void Start()
{
    Camera cam = GetComponent<Camera>();
    cam.aspect = targetRatio;
}
2
Apurva

前の幅を取得することが目標の場合:

[RequireComponent(typeof(Camera))]
public class ResizeCamera : MonoBehaviour 
{
    private float   DesignOrthographicSize;
    private float   DesignAspect;
    private float   DesignWidth;

    public  float   DesignAspectHeight;
    public  float   DesignAspectWidth;

    public void Awake()
    {
        this.DesignOrthographicSize = this.camera.orthographicSize;
        this.DesignAspect = this.DesignAspectHeight / this.DesignAspectWidth;
        this.DesignWidth = this.DesignOrthographicSize * this.DesignAspect;

        this.Resize();
    }

    public void Resize()
    {       
        float wantedSize = this.DesignWidth / this.camera.aspect;
        this.camera.orthographicSize = Mathf.Max(wantedSize, 
            this.DesignOrthographicSize);
    }
}
2
SylafrsOne

私はそれが古いスレッドであることを知っていますが、人々はまだ答えを探すことになります。

Unityのデフォルトとは異なる動作で、異なる画面アスペクト比にパースビューカメラを調整するには、三角法が必要です。それについて必要な情報はすべてここにあります: https://en.wikipedia.org/wiki/Angle_of_view

ただし、簡単な方法が必要な場合は、すべてのカメラタイプで機能するソリューションを以下に示します。 http://u3d.as/oUX

1
DominoOne

私がこれを解決した最も簡単な方法は、スティーブンが指摘したように、私の視点カメラのアスペクト比を私が開発したものに強制することでした。もちろん、私が開発したアスペクト比がデバイスのアスペクト比と異なる場合、これはいくつかのオブジェクトを変形させます。 UIオブジェクトの場合、ビルドインを使用している場合は、画面サイズが何パーセントであるかに基づいて四角形を作成します

Rect(0.5 * Screen.width, 0.5 * Screen.height, 0.25 * Screen.width, 0.25 * Screen.height) 

これにより、画面の左上隅が画面の中央に配置され、画面の高さの1/4と幅の1/4の長方形が作成されます。私はUIにNGUI 2.7を使用していますが、これまで異なるアスペクト比で問題は見られませんでしたが、UIをレンダリングするために正投影カメラを使用しています

1
user3234091

わかりました、これは大きな質問です。多くの人々は、アスペクト比を強制することについて言及していますが、これは考慮すべき良い解決策です。ただし、多くのゲームではこれは適切ではありません。多くのゲームデザインでは、ゲームが実行されているデバイス/画面にネイティブであるように感じさせ、画面のあらゆる広さの不動産を使用できるようにします。これを行うには、ゲーム内のすべてのシステムを構築し、さまざまなサイズと形の画面用にテストする必要があります。これは、複数のデバイス用のアプリやWebサイトを構築するのと非常によく似た問題です。

画面サイズ

画面サイズは、次のようなステートメントで DPI および resolution を使用してプログラムで取得できます。

Resolution res = Screen.currentResolution;
float screenSquareInches = res.width * res.height / Screen.dpi;

カメラを介して表示される画面上のコンテンツの場合、スケーリングが必要な変数は1つだけであり、それはカメラのサイズ(または、画面に押し込まれるゲームワールドの量)です。カメラのサイズは、3Dゲームの場合は 視野 で、2Dゲームの場合は 正投影サイズ で制御できます。どの方程式が最も広い範囲の画面サイズをサポートしているのかをテストするだけです。

// this should be a tweakable number, so you can fine tune it to your needs. It represents the screen size at which the camera size should not be scaled at all
float expectedScreenArea = 20;
// this number should also be tweakable, which declares how much smaller/larger text can get depending on the screen size. Generally larger screens are viewed from farther away, so scaling should be slight
float cameraScalingRate = 0.25f;
// multiply this number by the default/base camera size you have picked, whether that's field of view or orthographic size
float cameraSizeMultiplier = 1 + (screenSquareInches / expectedScreenArea - 1) * cameraScalingRate;

わかりました、それでゲームワールドのスケーリングに関するほとんどの方法が得られるはずですが、UI要素、テキスト、HUD、画面上のコントロールなどはどうでしょうか?テキストなどの要素の場合、上記の式は適切に機能するはずですが、スケーリングレートには別の値が必要な場合があります。画面上のコントロールの場合、ジョイスティックがタブレットの画面の中央ではなく下隅に移動するなど、より完全な変換が必要になる場合があります。タッチスクリーンデバイスでない場合は、画面上のコントロールをすべて削除します。それはこの質問の範囲外です。

スクリーンアスペクト比

画面のアスペクト比(幅と高さ)も重要であり、独自の処理が必要です。一般的にこれを行う最善の方法は、画面の垂直方向の高さを固定することです。これにより、画面が広くなると画面上の要素は拡大縮小されませんが、画面が高くなると、画面上の要素は画面が大きくなります。これはすでにカメラのデフォルトの動作ですが、UI要素の場合はそのように設定する必要があります。 canvasで新しいUIシステムを使用している場合、これは比較的簡単です。 CanvasScalarコンポーネントには、アスペクト比に応じて要素のスケーリング方法を制御する a property があります。これを幅または高さに合わせて変更し、高さに合わせます。

さらなる検討のために

さまざまな画面サイズと形状をサポートしているため、すべてを適合させる以上のことを検討する必要があります。また、さまざまな画面でゲームが適切にプレイされることを確認する必要があります。これは、小さな画面でプレイヤーに閉所恐怖症を感じさせないような微妙なものから、画面の外にいる敵がプレイヤーを撃てないようにすることから、画面上の要素を維持する境界を更新することまであります。これがPCゲームである場合に考慮すべきもう1つのことは、誰かが自分のコンピューターを別の画面に接続したり、その場で解像度を変更したりすることです。これを念頭に置いて、必要に応じて上記の式を再実行すると、プレーヤーがゲームを終了しなくても物事がすぐに揃うようにできます。

1
Semimono

この問題に関してAsset-storeに無料のアセットがあります...チェックアウトしてください...

http://u3d.as/content/palash-bhowmick/fit-all-screen-size/9q9

オブジェクトの形状が変更された場合、次で始まる行を削除します-

transform.localScale.x =

0
user2830124

選択の余地がない場合は、さらに作業を行い、カメラに次のような特別なスクリプトを追加することもできます。

  1. デバイスの画面解像度を確認します
  2. そのための目標解像度を設定します
  3. また、そのための目標アスペクト比を設定します(重要)

必要なのは、画面解像度(必要なデバイスの幅と高さの両方)を確認するための基本関数を作成し、適切な画面解像度とアスペクト比を設定するための機能を追加するだけです!

0
a_m_dev

2Dゲームを開発している場合、つまりカメラが正投影ビューになっている場合は、次のコードを実行してゲームオブジェクトに添付します。ゲームオブジェクト(この場合はSprite)を画面解像度でスケーリングします。

void Resize()
{
    SpriteRenderer sr=GetComponent<SpriteRenderer>();
    if(sr==null) return;

    transform.localScale=new Vector3(1,1,1);

    float width=sr.Sprite.bounds.size.x;
    float height=sr.Sprite.bounds.size.y;


    float worldScreenHeight=Camera.main.orthographicSize*2f;
    float worldScreenWidth=worldScreenHeight/Screen.height*Screen.width;

    Vector3 xWidth = transform.localScale;
    xWidth.x=worldScreenWidth / width;
    transform.localScale=xWidth;

    Vector3 yHeight = transform.localScale;
    yHeight.y=worldScreenHeight / height;
    transform.localScale=yHeight;

}
0
Shubhra

Unity3Dには独自のUIシステムがあるため、Unity Nowにとって非常に簡単です。 3D Unityの場合、画面サイズに合わせてカメラを自動的に調整します。実際にUIに問題が発生し、少し注意が必要です。まず、画面サイズに応じて位置とサイズを変更する必要がある要素を把握してください。たとえば、画面のちょうど中央にボタンがある場合。その後、画面に応じて位置を変更する必要はありません。中央に残ります。

右上または左上に一時停止ボタンが表示されるように、画面の隅にボタンがあるシナリオを考えてみましょう。次に、それに応じてボタンを隅に固定する必要があります。ゲームがどの画面サイズで実行されているかは関係ありません。一時停止ボタンはコーナーに固定する必要があります。

次に、メニューに背景がある別のケースを考えてみましょう。次に、このBGスプライトにストレッチを適用する必要があります。このBGはそれに応じて伸縮しますが、その上のすべてのアイテムには固定サイズがあります。このため、同じBGが16:10または4:3(UnityネイティブUIについてすべて)で良質になるように、BGをフラットにすることをお勧めします

0
Mubasher Ikram