it-swarm.com.de

So arbeiten Sie mit unterschiedlichen Bildschirmauflösungen

Ich verwende Unity 4.3.3 für mein Spiel. Ich mache ein Spiel für Android- und iOS-Geräte. Da ich für Unity noch relativ neu bin, kann ich anscheinend keinen Weg finden, mit einer anderen Bildschirmauflösung zu arbeiten. 

Ich möchte, dass mein Spiel im Vollbildmodus läuft. Ich habe es auf dem iPad 2 getestet und läuft einwandfrei, aber für iPhone 4 sind die Seiten abgeschnitten und für iPhone 5 sogar noch mehr. Was ist die Lösung? Welche Option sollte ich unter Player Settings> iOS> OtherSettings> Target Resolution auswählen?

50
Ashish Beuwria

unity passt seine In-Game-Kamera an die Abmessungen des Seitenverhältnisses des verwendeten Bildschirms an. Offensichtlich ist dies nicht immer erwünscht, daher gibt es einige Möglichkeiten:

1) Die erste Methode ist sehr einfach zu implementieren, obwohl sie selten gut aussieht. Sie können einfach das Seitenverhältnis der Kamera ändern, um es an das von Ihnen entwickelte Spiel anzupassen. Wenn Sie Ihr Spiel beispielsweise mit 4: 3 erstellt haben, würden Sie Folgendes tun:

Camera.aspect = 4f/3f;

Denken Sie daran, dass dies das Spiel bei verschiedenen Seitenverhältnissen verzerren wird.

2) Die andere Methode ist etwas komplexer, aber das Ergebnis sieht viel besser aus. Wenn Sie eine orthographische Kamera verwenden, ist zu beachten, dass die orthografische Kamera unabhängig von der verwendeten Bildschirmauflösung die Höhe auf einem festgelegten Wert hält und nur die Breite ändert. Bei einer orthographischen Kamera mit einer Größe von 10 wird die Höhe beispielsweise auf 2 festgelegt. Wenn Sie dies berücksichtigen, müssen Sie die größtmögliche Kamera in jeder Ebene ausgleichen (z. B. haben Sie einen breiteren Hintergrund.) ) oder ändern Sie die orthographische Größe der Kamera dynamisch, bis ihre Breite der von Ihnen erstellten entspricht.

GUI-Komponenten lassen sich einfacher implementieren, indem sie ihre Position so einstellen, dass sie bei Bedarf von der Bildschirmauflösung abhängt. Wenn Sie beispielsweise möchten, dass eine Schaltfläche in der oberen rechten Ecke angezeigt wird, setzen Sie einfach ihre Position auf etwas wie position = new Vector2(Screen.width - 50, 50);.

BEARBEITEN: Da Sie die von Ihnen verwendeten Geräte erwähnt haben, habe ich ein wenig nachgeschlagen, um herauszufinden, welches Seitenverhältnis verwendet wird: Ipad2 = 4: 3, Iphone4 = 3: 2 und Iphone5 = 16: 9

Da Sie sagten, es sieht auf dem Ipad2 perfekt aus, schätze ich, dass Sie Ihr Spiel für ein Seitenverhältnis von 4: 3 entwickelt haben. Das "Clipping", das Sie erwähnen, ist nur, dass sich Ihre orthographische Kamera erweitert hat. Die Lösung ist die Verwendung einer der beiden oben beschriebenen Methoden.

Sie können leicht erkennen, wie es auf jedem Gerät im Unity-Editor aussehen wird. Wenn Sie zur Registerkarte "Spiel" wechseln (was beim Drücken von "Play" im Unity-Editor angezeigt wird), werden Sie sehen, dass es einen Gerätenamen sowie eine Auflösung und ein Seitenverhältnis hat. Wenn Sie dies ändern, können Sie sehen, wie es bei verschiedenen Seitenverhältnissen aussehen wird.

38
Steven Mills

Sie können versuchen, die Geräteauflösung mithilfe von Camera.ScreenWidth und Camera.ScreenHeight zu erfassen.

Berechnen Sie dann die Differenz aus Ihrer Auflösung und wenden Sie sie auf das übergeordnete Objekt an. 

Dadurch wird alles größer/kleiner skaliert, um die Geräteauflösung anzupassen, ohne dass mehrere Bildauflösungen usw. für Geräte mit unterschiedlicher Auflösung vorhanden sind.

4
KennethLJJ

Sie müssen das Kamera-Ansichtsfenster entsprechend dem Seitenverhältnis des Geräts ändern. __ Angenommen, Sie haben das Spiel für 720x1080 erstellt

Dann sollten Sie es im Skript tun

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

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

Oder  

Die andere Möglichkeit ist, wenn Sie ein Spiel mit einem Seitenverhältnis von 9:16 erstellen

Tun Sie dies in Ihrem Skript,

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

Wenn Ihr Ziel ist, die vorherige Breite zu erhalten:

[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

Ich weiß, dass es ein alter Faden ist, aber die Leute könnten trotzdem nach einer Antwort suchen.

Um eine perspektivische Kamera an andere Bildschirmseitenverhältnisse anzupassen, die sich von der Unity-Standardeinstellung unterscheiden, benötigen Sie Trigonometrie. Alle notwendigen Informationen dazu finden Sie hier: https://de.wikipedia.org/wiki/Angle_of_view

Wenn Sie einen einfachen Ausweg wollen, finden Sie hier eine Lösung, die mit allen Kameratypen funktioniert: http://u3d.as/oUX

1
DominoOne

Der einfachste Weg, den ich gelöst habe, war, wie Steven herausgearbeitet hat, zwingen Sie mein perspektivisches Seitenverhältnis zu dem, für das ich entwickle. Natürlich verformt dies einige Objekte, wenn sich das von mir entwickelte Aspektverhältnis von dem des Geräts unterscheidet. Wenn Sie das UI-Objekt verwenden, erstelle ich die Rechtecke auf der Grundlage eines Prozentsatzes der Bildschirmgröße 

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

Dadurch wird die obere linke Ecke in der Mitte des Bildschirms platziert und ein Rechteck mit 1/4 der Höhe und 1/4 der Bildschirmbreite erstellt. Ich verwende NGUI 2.7 für die Benutzeroberfläche, und ich habe bisher keine Probleme mit unterschiedlichen Seitenverhältnissen gesehen. Außerdem wurde die Benutzeroberfläche mit einer orthographischen Kamera gerendert

1
user3234091

Ok, das ist eine große Frage. Viele Leute haben angesprochen, ein Seitenverhältnis zu erzwingen, was eine gute Lösung ist. Für viele Spiele ist dies jedoch nicht angebracht. Bei vielen Spieldesigns möchten Sie, dass sich das Spiel anfühlt, als wäre es für das Gerät/den Bildschirm nativ, auf dem es läuft, und Sie möchten jeden Quadratzentimeter Bildschirmfläche nutzen, den Sie können. Dazu müssen Sie jedes System in Ihrem Spiel für unterschiedlich große und geformte Bildschirme erstellen und testen. Es ist ein sehr ähnliches Problem beim Erstellen von Apps und Websites für mehrere Geräte.

Bildschirmgröße

Die Bildschirmgröße kann programmgesteuert mit DPI und der Auflösung mit einer Anweisung abgerufen werden:

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

Für den Inhalt des Bildschirms, der über die Kamera betrachtet wird, gibt es nur eine Variable, die skaliert werden muss. Dies ist die Größe der Kamera (oder wie viel Material in der Spielwelt auf den Bildschirm gedrückt wird). Sie können die Größe der Kamera mit dem Sichtfeld für 3D-Spiele oder der orthografischen Größe für 2D-Spiele steuern. Nur beim Test wird angegeben, welche Gleichung die größte Auswahl an Bildschirmgrößen unterstützt. Etwas in dieser Richtung könnte jedoch gut sein:

// 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;

Ok, das sollte Ihnen die Skalierung der Spielwelt erleichtern, aber was ist mit den Elementen der Benutzeroberfläche, Text, HUD und Steuerelementen auf dem Bildschirm? Nun, für Elemente wie Text sollte die obige Gleichung anständig funktionieren, auch wenn Sie einen anderen Wert für die Skalierungsrate wünschen. Für Steuerelemente auf dem Bildschirm möchten Sie möglicherweise eine umfassendere Umwandlung durchführen, z. B. Joysticks, die sich auf einem Tablet zu den unteren Ecken des Bildschirms bewegen und nicht an den Seiten zentriert sind. Wenn es sich nicht um ein Touchscreen-Gerät handelt, entfernen Sie die Steuerelemente auf dem Bildschirm vollständig. Das ist nicht Gegenstand dieser Frage.

Bildschirm-Seitenverhältnis

Das Seitenverhältnis des Bildschirms (wie groß und groß ist es) ist ebenfalls wichtig und erfordert ein eigenes Handling. Im Allgemeinen ist dies der beste Weg, um die vertikale Höhe des Bildschirms einzufrieren. Wenn der Bildschirm breiter wird, werden die Elemente auf dem Bildschirm nicht skaliert. Wenn der Bildschirm jedoch größer wird, skalieren die Elemente auf dem Bildschirm proportional zu der größeren Höhe der Bildschirm wächst Dies ist bereits das Standardverhalten für Kameras, aber für Benutzeroberflächenelemente müssen Sie es als solches festlegen. Dies ist relativ einfach, wenn Sie das neue UI-System mit Canvas verwenden. Bei einer CanvasScalar-Komponente gibt es eine Eigenschaft , die steuert, wie die Elemente abhängig vom Seitenverhältnis skaliert werden. Ändern Sie dies, um die Breite oder Höhe anzupassen und die Höhe anzupassen.

Zur weiteren Betrachtung

Durch die Unterstützung verschiedener Bildschirmgrößen und -formen müssen Sie nicht nur alles passend machen. Sie müssen auch sicherstellen, dass das Spiel auf den verschiedenen Bildschirmen gut funktioniert. Dies reicht von so subtilen Dingen, dass der Spieler sich auf einem kleinen Bildschirm nicht klaustrophobisch fühlt, bis er sicherstellt, dass Gegner nicht auf den Spieler schießen können, wenn sie sich außerhalb des Bildschirms befinden, um sicherzustellen, dass die Grenzen aktualisiert werden, die Elemente auf dem Bildschirm anzeigen Bei einem PC-Spiel ist zu berücksichtigen, dass jemand seinen Computer an einen anderen Bildschirm anschließt oder die Auflösung im Handumdrehen ändert. Vor diesem Hintergrund kann es gut sein, die obigen Gleichungen nach Bedarf erneut auszuführen, damit ein Spieler das Spiel nicht beenden muss, um die Dinge wieder in Ordnung zu bringen.

1
Semimono

Es gibt ein kostenloses Asset in Asset-Store in Bezug auf dieses Problem.

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

wenn die Form Ihres Objekts geändert wird, löschen Sie die Zeilen, die beginnen mit: -

transform.localScale.x =

0
user2830124

wenn Sie keine Wahl haben, können Sie auch mehr Arbeit erledigen und Ihrer Kamera ein spezielles Skript hinzufügen, das: 

  1. überprüft die Bildschirmauflösung für das Gerät
  2. legt die Zielauflösung dafür fest
  3. und setzt auch das Zielseitenverhältnis für das (WICHTIG)

sie müssen lediglich eine Basisfunktion schreiben, um die Bildschirmauflösung (sowohl Breite als auch Höhe für die gewünschten Geräte) zu überprüfen, und dann weitere Funktionen hinzufügen, um die richtige Bildschirmauflösung und das richtige Seitenverhältnis einzustellen.

0
a_m_dev

Wenn Sie ein 2D-Spiel entwickeln, dh Ihre Kamera befindet sich in der orthographischen Ansicht, dann führen Sie einfach den folgenden Code aus und fügen Sie ihn Ihrem Spielobjekt hinzu. Das Spielobjekt (in diesem Fall das Sprite) wird mit der Bildschirmauflösung skaliert.

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

Es ist sehr einfach für Unity Now, da Unity3D ein eigenes UI-System hat. Für 3D-Einheit Passt die Kamera automatisch an die Bildschirmgröße an. Das Problem tritt tatsächlich für die Benutzeroberfläche auf und ist ein bisschen schwierig. Versuchen Sie zunächst herauszufinden, welche Elemente Position und Größe mit der Bildschirmgröße ändern müssen. Wenn Sie beispielsweise eine Schaltfläche genau in der Bildschirmmitte haben. Dann muss die Position nicht entsprechend dem Bildschirm geändert werden. Es wird in der Mitte bleiben. 

Nehmen wir nun ein Szenario an, in dem Sie eine Schaltfläche in der Ecke des Bildschirms haben, wie die Pause-Schaltfläche oben rechts oder oben links. Nun müssen Sie Ihren Button entsprechend in der Ecke verankern. Es ist egal, auf welcher Bildschirmgröße das Spiel läuft, der Pausentaster sollte an der Ecke bleiben. 

Nehmen wir nun einen anderen Fall, in dem Sie einen Hintergrund in Ihrem Menü haben. Jetzt müssen Sie Stretch für diesen BG-Sprite anwenden. Dieser BG wird entsprechend gedehnt und geschrumpft, aber alle Artikel haben eine feste Größe. Dafür ist es ratsam, BGs flach zu haben, damit ein BG für 16:10 oder 4: 3 eine gute Qualität haben kann .__ (Es dreht sich alles um Unity Native UI)

0
Mubasher Ikram