Ich habe viele Antworten auf diese Frage bekommen, aber sie sind alle allgemein und im Allgemeinen nicht sehr nützlich. In keinem der Tutorials geht es um das Seitenverhältnis und den Umgang mit Mobilgeräten, und es gibt unzählige Möglichkeiten, dies zu tun. Alle scheinen Probleme und Mängel zu haben.
Ich würde wirklich gerne wissen, welche erfolgreichen Spiele verwendet wurden, um verschiedene Seitenverhältnisse auf iOS und Android zu handhaben, ohne dass Millionen von Assets unterschiedlicher Größe erstellt wurden.
Ich spreche streng genommen mobil, nicht desktop, speziell mit Unity, und ich interessiere mich nicht für die Benutzeroberfläche, ich interessiere mich nur für den Gameplay-Canvas.
Ich habe Probleme, wenn es wichtige Dinge gibt, die sich an bestimmten Orten befinden müssen und nicht vom Bildschirm fallen können. Die Verwendung von schwarzen Balken oben oder unten ist heutzutage nicht mehr akzeptabel.
quelle
Antworten:
Sie möchten das Kamera-Ansichtsfenster auf Hoch- oder Querformat beschränken (je nach Ihren Anforderungen), indem Sie die
camera.orthographicSize
Eigenschaften berechnen , sodass Sie Ihre 2D-Szene unabhängig von Seitenverhältnis und Auflösung erstellen können:Wenn Sie weitere Informationen dazu benötigen, fragen Sie bitte und ich werde antworten. ;) Grüße und Prost.
UPDATE: Verwenden Sie das Objektverankerungsskript von Eliot Lash zusammen mit diesem Skript , um Objekte bei Bedarf an Schlüsselpositionen auf dem Bildschirm zu platzieren (relativ zu Bildschirmecken / -rändern). Wenn Sie dies tun, benennen Sie "CameraFit" in "ViewportHandler" um.
Vorschau zur Simulation verschiedener Seitenverhältnisse:
quelle
GetComponent<Camera>().orthographicSize = UnitSize / 2f;
Musste nur ein paar Zeilen in das Skript einfügen und ich verwende es zum Definieren von HöheneinheitenNormalerweise benötigen Sie keine unterschiedlichen Größen für Assets - importierte Texturen und Sprites mit automatisch generierten Mip-Maps sehen gut aus, wenn sie in einer Größe gerendert werden, die kleiner oder gleich der ursprünglichen Pixelgröße des Bildes ist.
Das Szenenlayout ist die Herausforderung. Ein guter Ansatz ist folgender (und zu meiner Information verwende ich eine 3D-Kamera, die 2D-Inhalte mit z = 0 betrachtet):
In Codeform:
quelle
Wenn Sie mit der Verwendung der Leisten anfangen, ist die Implementierung eigentlich recht einfach (ich poste dies, obwohl das OP die Meinung vertrat, dass dies nicht akzeptabel ist, da es den Vorteil hat, dass es auf Mobilgeräten nicht annähernd so schlecht ist, und es ist eine einfache Lösung dafür benötigt überhaupt keinen Code)
Camera.orthographicSize
ist eine Variable innerhalb der Orthokamera (die die meisten 2D-Spiele verwenden), die die gemessene Anzahl von Spieleinheiten vertikal auf dem Bildschirm ( geteilt durch 2 ) ( Quelle ) anpasst . Wählen Sie daher ein Seitenverhältnis, das für die meisten Geräte geeignet ist (ich habe 16: 9 gewählt, da die meisten von mir untersuchten Bildschirme 16: 9, 16:10, 3: 2 sind), und fügen Sie eine Maske hinzu, die dieses Seitenverhältnis überlagert.Beispiel :
In meinem Spiel (hier nicht aufgeführt, da es sich nicht um eine Anzeige handelt, kann bei Bedarf nach Kommentaren gefragt werden) verwenden wir den Porträtmodus. Um ein einfaches 16: 9 zu machen, habe ich meine Ortho-Kamera in Größe 16 erstellt. Dies bedeutet, dass die Kamera 32 Spielhöheneinheiten (y: 16 bis -16 in meinem Fall) an die Vertikale des Geräts auf dem Bildschirm anpasst.
Ich habe dann schwarze Masken mit einem Spiel zwischen -9 und +9 platziert. Voila, der Bildschirm des Spiels sieht auf allen Geräten gleich aus und auf Geräten, die etwas breiter sind, etwas dünner. Ich habe absolut keine negativen Rückmeldungen bezüglich der Masken erhalten. Um Querformat zu erstellen, drehen Sie diese Werte einfach um und stellen Sie die Kamera auf Größe 9 ein. Ändern Sie die Werte so, dass sie mit den von Ihnen gewählten Maßstäben für die Spieleinheiten übereinstimmen.
Der einzige Ort, an dem der schwarze Balken deutlich zu sehen ist, ist auf dem iPad mit 3: 2. Auch dann habe ich keine Beschwerden gehabt.
quelle
Ich mache das in einem Spiel, an dem ich gerade arbeite. Ich habe ein Hintergrundbild mit einer Größe von 1140 x 720. Die wichtigsten Teile (die niemals abgeschnitten werden sollten) sind im mittleren Bereich von 960 x 640 enthalten. Ich führe diesen Code in der Startfunktion meiner Kamera aus:
Ich definiere auch andere Größen als die Schriftgröße für Schaltflächen und dergleichen. Es funktioniert gut mit jedem Seitenverhältnis, das ich getestet habe. Es ist schon eine Weile her, seit ich es eingerichtet habe, daher kann mir ein Schritt fehlen. Lassen Sie mich wissen, wenn es nicht wie erwartet funktioniert, und ich werde sehen, ob ich etwas ausgelassen habe.
quelle
@ Marcel's Antwort und Code sind großartig und haben mir geholfen zu verstehen, was passiert ist. Es ist die endgültige Antwort. Ich dachte, jemand könnte auch nützlich finden, was ich für meinen speziellen Fall getan habe: Da ich etwas wirklich sehr einfaches wollte, ein Sprite, das immer auf dem Bildschirm zu sehen ist, habe ich mir die folgenden Zeilen ausgedacht:
Ich habe dies der Kamera hinzugefügt und mein Sprite (das ist mein Hintergrund) in die einzige Eigenschaft des Skripts gezogen. Wenn Sie keine schwarzen Balken (horizontal oder vertikal) möchten, können Sie einen größeren Hintergrund hinter diesen einfügen ...
quelle
Es gibt ein paar Möglichkeiten, um dieses Problem anzugehen, und es gibt keine perfekte Lösung (zumindest habe ich noch keine gefunden), und die Art der Lösung, mit der Sie arbeiten, hängt stark von der Art des Spiels ab, das Sie spielen Entwicklung.
Unabhängig davon, was Sie tun, sollten Sie zunächst die niedrigste Auflösung auswählen, die Sie unterstützen möchten, und Ihre Sprites auf diese Auflösung aufbauen. Wenn Sie also an der Entwicklung für iOS interessiert sind, beträgt die niedrigste iOS-Geräteauflösung laut http://www.iosres.com/ 480 x 320.
Von dort aus können Sie die Sprites skalieren, um die höheren Auflösungen zu erreichen. Der Nachteil dabei ist, dass Sie mit der Zeit bemerken werden, dass die Sprites mit zunehmender Skalierung verschwimmen. In diesem Fall können Sie zu einer anderen Gruppe von Sprites wechseln, die für höhere Auflösungen entwickelt wurden.
Oder Sie können die Skalierung komplett ignorieren und einfach entscheiden, mehr Spielbildschirm für höhere Auflösungen anzuzeigen (ich glaube, Terraria macht das zum Beispiel so). Für viele Spiele ist dies jedoch nicht angemessen. Wettbewerbsspiele zum Beispiel.
Ist es? Viele Spiele, die ein Seitenverhältnis von 4: 3 erzwingen möchten, tun dies. Da Sie Unity verwenden, können Sie das AspectRatioEnforcer- Skript verwenden, um dies zu unterstützen.
quelle
Es gibt mehrere Möglichkeiten, um dieses Problem zu lösen. Es hängt von Ihrem Spiel ab und davon, was am besten funktioniert. Zum Beispiel haben wir in unserem Spiel Tyrant Unleashed einfach breite Karten mit unwichtigen Details an den Seiten erstellt, sodass es in Ordnung ist, die Seiten bei schmaleren Geräten abzuschneiden. Andere Spiele sind jedoch möglicherweise besser geeignet, wenn Sie die Schaltflächen verschieben oder etwas, das besser auf den Bildschirm passt.
(Teil unseres Ansatzes ist es auch, auf allen Geräten eine einheitliche Höhe beizubehalten und nur die Breite zu variieren. Dies erleichtert uns sicherlich das Leben, aber auch dies kann für Ihr spezielles Spiel von Vorteil sein oder auch nicht. Es spielt keine Rolle in unser Kunststil, wenn die Bilder auf verschiedenen Bildschirmen ein wenig skaliert werden, während dies für etwas wie Pixelkunst von Bedeutung sein kann. Grundsätzlich ist dies der Ansatz "Unity damit umgehen lassen".
quelle
Ich verwende das folgende Skript, das
targetAspect
der Kamera einen Parameter hinzufügt und diesenorthographicSize
in Bezug auf das Bildschirmverhältnis anpasst (weitere Details in diesem Blog-Beitrag ):quelle
Meine Methode ähnelt größtenteils den von anderen angegebenen Lösungen :) Ich werde versuchen, den Ansatz, mit dem ich das Spiel unabhängig von der Bildschirmgröße mache, detailliert zu erklären.
Bildschirmausrichtung
Abhängig von der Bildschirmausrichtung (Querformat oder Hochformat) müssen Sie überlegen, ob die Kamera mit einer festen Höhe oder einer festen Breite skaliert. Meistens wähle ich eine feste Breite für Spiele im Querformat und eine feste Höhe für Spiele im Hochformat.
Kameraskalierung
Wie bereits erwähnt, kann dies entweder eine feste Höhe oder eine feste Breite sein.
Feste Höhe : Der vertikale Bereich des Spiels passt immer zur Bildschirmhöhe. Und wenn sich das Seitenverhältnis des Bildschirms ändert, wird links und rechts auf dem Bildschirm zusätzlicher Platz hinzugefügt. Um dies zu implementieren, müssen Sie nichts codieren, es ist das Standardverhalten von Unity Camera.
Feste Breite : Der horizontale Bereich des Spiels passt immer zur Bildschirmbreite. Wenn sich das Seitenverhältnis des Bildschirms ändert, wird oben und unten zusätzlicher Platz hinzugefügt. Um dies zu implementieren, müssen Sie ein kleines Stück Code schreiben. Stellen Sie später sicher, dass Sie die Aktualisierungsfunktion für das Code-Formular entfernen und aktivieren.
Im Editor können Sie die targetWidth ändern, um den anzuzeigenden Weltraumbereich zu definieren. Dieser Code wird im folgenden Video zusammen mit vielen anderen Methoden für 2D-Spiele erklärt :)
Unite 2014 - 2D-Best Practices in Unity
Seitenverhältnis
Das folgende Seitenverhältnis wird von der breitesten bis zur engsten Seite angezeigt und deckt nahezu alle Bildschirmgrößen für Android und iOS ab
Normalerweise stelle ich alle diese Seitenverhältnisse in der angegebenen Reihenfolge unter dem Spielfenster ein, da dies beim Testen auf verschiedene Bildschirmgrößen praktisch ist :)
Verbrauchsfläche
Dies ist der Bereich, der je nach gewählter Kameraskalierung seitlich oder oben / unten zum Bildschirm hinzugefügt wird.
Für eine feste Höhe sollten alle Spielelemente vorzugsweise im Verhältnis 16: 9 passen, das am engsten ist. Und der Hintergrund sollte sich erstrecken, bis er das Verhältnis 5: 4 abdeckt. Das stellt sicher, dass Ihr Spiel niemals schwarze Streifen an den Seiten hat.
Bei fester Breite ist es fast dasselbe, aber hier sollten die Elemente im Verhältnis 5: 4 passen und der HG sollte bis 16: 9 reichen.
Grenzen
Manchmal können wir den Ansatz für den Verbrauchsbereich nicht verwenden, da wir den gesamten verfügbaren Bildschirm für das Spiel nutzen müssen.
Stellen Sie sich beispielsweise ein Porträtspiel mit fester Höhe vor, bei dem die vom Himmel fallenden Münzen aufgefangen werden. In diesem Fall müssen wir dem Player die Möglichkeit geben, sich horizontal über die verfügbare Bildschirmbreite zu bewegen.
Daher müssen wir die Grenzen der Kamera in Bezug auf die Weltkoordinaten kennen, um genau zu wissen, wo sich die linken, rechten, oberen oder unteren Bereiche der Kameraclips an der Weltposition befinden.
Wir können diese Schranken auch verwenden, um Spielelemente oder die Benutzeroberfläche an einer gewünschten Seite der Kamera zu verankern.
Mit Camera.ViewportToWorldPoint können wir die Grenzen ermitteln. Der Viewport-Bereich ist normalisiert und relativ zur Kamera. Unten links in der Kamera befindet sich (0,0). oben rechts ist (1,1). Die z-Position wird in Welteinheiten von der Kamera angegeben. Bei 2D / Orthographie spielt das z keine Rolle.
Benutzeroberfläche
Für die Benutzeroberfläche können wir dieselben Konzepte anwenden, die wir für die Spielelemente verwendet haben. Nach der Einführung von Unity5 UI und der Verfügbarkeit von Plugins wie NGUI wird dies kein großes Problem sein :)
quelle
Ich habe das Unity-Asset "Resolution Magic 2D" erstellt, um dieses Problem zu lösen (Anzeige: Sie können es im Unity-Asset-Store oder unter grogansoft.com abrufen).
Ich ging das Problem folgendermaßen an ...
Definieren Sie einen Bereich des Bildschirms, der unabhängig von Seitenverhältnis / Auflösung immer sichtbar sein muss, und verwenden Sie eine einfache Rechtecktransformation, um diesen Bereich zu "schablonieren". Dies ist Ihre ideale Bildschirmform. Mit einem einfachen Algorithmus zoome ich dann die Kamera, bis der durch das Rechteck ausgeblendete Bereich so groß wie möglich ist, während er für die Kamera immer noch zu 100% sichtbar ist.
Dann nimmt Ihr Hauptspielbereich immer so viel Bildschirm wie möglich ein. Und solange außerhalb des zuvor definierten Rechteckbereichs genügend zusätzlicher Inhalt (z. B. Ihr Hintergrund) vorhanden ist, wird Spielern, deren Bildschirm nicht das gleiche Seitenverhältnis aufweist wie Ihr ideales Rechteck, der zusätzliche Inhalt angezeigt, an dem sonst schwarze Balken angezeigt würden gehen.
Mein Asset enthält auch eine Logik zum Platzieren der Benutzeroberfläche, die jedoch aufgrund des neuen Unity-Benutzeroberflächensystems größtenteils veraltet ist.
Mein Asset bietet dies sofort mit minimalem Setup und es funktioniert wirklich gut auf allen Plattformen.
Wenn Sie diese Technik (oder meinen Vorteil) verwenden, stellen Sie einfach sicher, dass Sie Ihr Spiel so gestalten, dass rundherum "optionaler" Platz für Bildschirme vorhanden ist, die breiter oder höher als Ihr Ideal sind (um schwarze Balken zu vermeiden).
Ich persönlich mache keine 3D-Spiele, daher weiß ich nicht, ob dies in 3D funktionieren würde (oder ob es überhaupt notwendig ist).
Es ist wirklich schwer zu erklären, ohne Bilder, also besuchen Sie bitte meine Website ( Resolution Magic 2D )
quelle
Die beste Lösung für mich ist, den Satz von sich kreuzenden Linien so zu verwenden, dass es weder zu einem Schnitt an den Seiten noch zu einer Verzerrung der Spielansicht kommt. Das bedeutet, dass Sie je nach Seitenverhältnis einen Schritt zurück oder einen Schritt nach vorne machen müssen.
quelle
Ich habe eine AssetStore-Erweiterung namens AspectSwitcher erstellt, die einen einfacheren Aspektwechsel ermöglicht . Es bietet ein System, mit dem Sie einfach verschiedene Eigenschaften für verschiedene Aspekte angeben können. Es gibt im Allgemeinen zwei Methoden, mit denen die meisten Menschen Aspekte wechseln. Zum einen müssen für jeden Aspekt unterschiedliche Spielobjekte bereitgestellt werden. Der andere besteht darin, benutzerdefinierten Code zu erstellen, der die Eigenschaften eines einzelnen Spielobjekts basierend auf dem aktuellen Aspekt ändert. Das erfordert in der Regel viel benutzerdefiniertes Codieren. Meine Erweiterung versucht, eine Menge dieser Schmerzen zu lindern.
quelle