Warum verwendet Unity im 2D-Modus die Skalierung und die standardmäßige othografische Größe so wie sie ist?

8

Ich habe zuvor SFML, XNA, Monogame usw. verwendet, um 2D-Spiele zu erstellen. Wenn ich ein 100-Pixel-Sprite auf dem Bildschirm anzeige, nimmt es 100 Pixel ein . Wenn ich 128px-Kacheln verwende, um einen Hintergrund zu erstellen, befindet sich die erste Kachel bei (0, 0), während die zweite bei (128, 0) liegt.

Unity hingegen hat ein eigenes ungerades Einheitensystem, das alle Transformationen, Pixel-zu-Einheiten, othografische Größe usw. usw. skaliert. Meine Frage ist also zweifach:

  1. Warum hat Unity dieses System standardmäßig für 2d? Ist es für mobile Entwickler? Gibt es einen großen Vorteil, den ich nicht sehe?
  2. Wie kann ich meine Umgebung so einrichten, dass ein 128 x 128-Sprite in Photoshop in Unity als 128 x 128-Sprite angezeigt wird, wenn ich mein Spiel starte?

Beachten Sie, dass ich ausschließlich auf den Desktop abziele.

Neophyt
quelle
1
Dies liegt daran, dass Unity eine 3D-Engine war, in die kürzlich 2D-Grafiken eingepfropft wurden. Wie man jedoch mit allem umgeht, ist etwas, auf das ich gespannt sein würde, um Antworten zu sehen, um zu sehen, ob jemand anderes einen besseren Ansatz hat als ich.
Jhocking
Mit den GUI-Funktionen und der GUITexture-Komponente von Unity können Sie Texturen direkt in nativer Größe auf den Bildschirm zeichnen. docs.unity3d.com/Documentation/ScriptReference/GUI.html docs.unity3d.com/Documentation/Components/class-GuiTexture.html Wenn Sie mehr Flexibilität benötigen, definieren Sie am besten eine konsistente Skala - wie 1U = 128px - und Wenden Sie es konsequent auf alle Ihre Quads / Sprites / Kameras an.
DMGregory
Ich würde die GUI-Klasse von Unity vermeiden. Da die GUI im Sofortmodus in Unity ziemlich ineffizient ist, wird ein neues GUI-System erstellt (das in Version 4.6 veröffentlicht werden soll).
Schockieren

Antworten:

4

Der Umgang mit 2D-Koordinaten und die Skalierung in Unity ist recht einfach, aber nicht offensichtlich, und wie Sie bemerkt haben, unterscheidet es sich von der Funktionsweise anderer Entwicklungswerkzeuge. Dies liegt daran, dass Unity eine 3D-Engine war, in die kürzlich 2D-Grafiken eingepfropft wurden.

Insbesondere ist 1 Einheit in Unity nicht unbedingt 1 Pixel im Bild. Wenn Sie Bilder als 2D-Sprites importieren, gibt es tatsächlich eine Pixel-zu-Einheiten-Einstellung, die 1: 1 vorgenommen werden kann. Ich empfehle jedoch aus mehreren Gründen, die Standardeinstellung 100: 1 beizubehalten (die Physik-Engine funktioniert nicht richtig bei 1: 1: 1). 1, und die Standardeinstellung ist besser für die Kompatibilität mit dem Code anderer).

Diese Skalierungseinstellung bedeutet, dass alle Positionen durch 100 geteilt werden. Es ist ziemlich einfach, solange Sie sich immer an die Skalierung erinnern. Wenn Sie ein Sprite um 256 Pixel verschieben möchten (z. B.), verschieben Sie es um 2.56. Sie können auch eine Dienstprogrammfunktion schreiben, um Zahlen auf 2 Dezimalstellen / das nächste Pixel zu runden: Mathf.Round (float * 100) / 100f


Um eine pixelgenaue Kamera einzurichten, setzen Sie sie zunächst als orthografische Kamera ein. Wenn Sie die Kamera auswählen, befindet sich in ihren Einstellungen ein Dropdown-Menü für die perspektivische oder orthografische Projektion. Perspektive bedeutet, dass die Dinge 3D aussehen, während orthografisch die Szene flach anzeigt. Direkt unter dieser Dropdown-Liste befindet sich Größe. Stellen Sie die orthografische Größe der Kamera auf die Hälfte der Pixelabmessungen des gewünschten Bildschirms ein.

Angenommen, Sie möchten einen pixelgenauen 1024 x 768-Bildschirm. Das bedeutet, dass die Kamerahöhe 384 Pixel betragen sollte. Teilen Sie dies durch 100 (aufgrund der Pixel-zu-Einheiten-Skalierung) und Sie erhalten 3,84 für die Kameragröße. Auch diese Mathematik ist einfach SCREEN_SIZE / 2 / 100f


(Ich habe darauf gewartet, welche anderen Antworten zuerst kommen, aber es ist ein paar Tage her. Ich habe 2D in Unity eine Weile mit 2D Toolkit ausgeführt , bin aber relativ neu in den integrierten 2D-Funktionen.)

jhocking
quelle
2

Wie jhocking sagt, ist es ein Ergebnis des Schuhmachens von 2D in eine 3D-IDE. Aber es gibt eine Lösung, es ist nur ein bisschen arkan.

Der erste Schritt besteht darin, die Importeinstellungen Ihres Sprites im Projektbereich zu öffnen. Sobald der Texturtyp auf Sprite oder Erweitert eingestellt ist (Erweitert bietet Ihnen andere nützliche Optionen, Sprite ist jedoch die Standardeinstellung, wenn Sie zu Beginn ein 2D-Projekt erstellt haben), wird ein Feld Pixel zu Einheiten mit der Standardeinstellung 100 angezeigt.

Ich mache mit einem Kachelsystem rum, also verwende ich 16x16-Pixel-Kacheln und setze Pixel auf Einheiten auf 16. Die Mathematik funktioniert folgendermaßen: Größe in Pixel (entweder X oder Y) / Pixel in Einheiten = Einheit in Transformation . Der 16-Pixel-Würfel mit PTU 16 nimmt 1 Einheit im Unity-Raum ein.

Ich habe es noch nicht versucht, aber ich gehe davon aus, dass eine PTU von 1 die Dinge pixelgenau machen würde.

Die Einstellung der orthografischen Kamera bereitet jedoch ein wenig Kopfschmerzen. Erneut basiert es auf der Einstellung Pixel zu Einheiten, aber auch auf einigen anderen Dingen. Grundsätzlich ist es die Hälfte der Bildschirmhöhe von den Player-Einstellungen (dh 1080, 768, was auch immer das iPhone 5 ist, kann nicht nachgeschlagen werden) geteilt durch Pixel zu Einheiten.

PatrionDigital
quelle
1

Pixeleinheiten sind keine gute Möglichkeit, große Welten darzustellen, da Gleitkommazahlen funktionieren. Bei Gleitkommazahlen verlieren Sie bei sehr großen Zahlen an Genauigkeit. Zahlen nahe 0 haben die beste Genauigkeit. Daher bevorzugen einige Spiele-Engines das MKS-Metriksystem (Meter / Kilogramm / Sekunden). Die Einheit ist standardmäßig auf Meter eingestellt, sodass Spielcharaktere mit sehr guter Präzision leicht als 1,0 bis 2,0 Meter hoch dargestellt werden können.

Das durchschnittliche Gewicht und die durchschnittliche Größe eines menschlichen Mannes beträgt etwa 50 kg und ist 1,8 m groß. Wenn Sie versuchen würden, ein Zeichen mit einer Größe von 1200 Pixel zu erstellen, würde sein Gewicht etwa 33.000 Pixel betragen. Wenn Sie dann einem Spiel ein sehr schweres Objekt wie einen Bus hinzufügen möchten, haben Sie eine große Anzahl von Pixeleinheiten. Sie können leicht erkennen, wie dies zu sehr ungenauen Berechnungen für Kollisionen führen kann.

Wenn Sie sehr entschlossen sind, Pixeleinheiten zu verwenden, können Sie das Verhältnis von Pixeln zu Metern leicht berechnen.

LVBen
quelle
All dies gilt jedoch nicht für die meisten 2D-Spiele, die kaum Physik benötigen. Das Problem ist, dass Unity die Unterstützung von 2D vorschlägt, dies jedoch sehr rudimentär ist und viel Studium erfordert, um das zu vereinfachen, was Sie wirklich von einer 2D-Engine benötigen.
Kokodoko