Unity: Spiel bleibt nicht im 9:16-Format- wie fixieren?
Ich entwickle eine App in Unity und möchte, dass das Spiel immer im 9:16-Format bleibt, egal auf welchem Gerät es läuft. Momentan passt sich die Größe automatisch an die Bildschirmauflösung an, aber ich möchte verhindern, dass das Seitenverhältnis verändert wird. Wie kann ich das fixieren, damit es immer bei 9:16 bleibt, selbst wenn das Gerät ein anderes Format hat? Gibt es eine Einstellung in der Kamera oder einen anderen Trick?
Danke für jede Hilfe!
2 Antworten
Um sicherzustellen, dass das Seitenverhältnis deines Spiels immer im 9:16-Format bleibt, unabhängig von der Bildschirmauflösung oder dem Gerät, kannst du in Unity einige Schritte unternehmen, um das Seitenverhältnis zu fixieren. Hier sind die wichtigsten Methoden, die du verwenden kannst:
Methode 1: Verwende denAspect Ratio Fitter
(UI-bezogen)Wenn du das Seitenverhältnis für die Benutzeroberfläche (UI) fixieren möchtest, kannst du den
Aspect Ratio Fitter
in Unity verwenden. Dies ist eine einfache Methode, wenn du UI-Elemente im festen Seitenverhältnis anzeigen möchtest.
- Wähle das UI-Element, das du fixieren möchtest.
- Füge den
Aspect Ratio Fitter
- -Komponenten zu diesem Element hinzu.
- Setze das Seitenverhältnis auf
9:16
- (0.5625).
Für die 3D- oder 2D-Welt in deinem Spiel kannst du die Kamera so konfigurieren, dass das Seitenverhältnis immer 9:16 bleibt. Du kannst dies tun, indem du das Viewport-Seitenverhältnis über ein Skript erzwingst. Hier ist, wie du es umsetzen kannst:
- Skript erstellen, um das Seitenverhältnis zu erzwingen: Du kannst ein Skript erstellen, das das Seitenverhältnis der Kamera automatisch anpasst, um sicherzustellen, dass es immer bei 9:16 bleibt.
csharp
Kopieren
using UnityEngine;
public class LockAspectRatio : MonoBehaviour
{
void Start()
{
// Setze das gewünschte Seitenverhältnis (9:16)
float targetAspect = 9f / 16f;
// Berechne das aktuelle Seitenverhältnis des Bildschirms
float currentAspect = (float)Screen.width / (float)Screen.height;
// Berechne den Skalierungsfaktor
float scaleHeight = currentAspect / targetAspect;
// Wenn das aktuelle Seitenverhältnis höher als das Ziel-Seitenverhältnis ist, passen wir die Höhe an
if (scaleHeight > 1f)
{
Camera.main.rect = new Rect(0f, (1f - 1f / scaleHeight) / 2f, 1f, 1f / scaleHeight);
}
else // Andernfalls passen wir die Breite an
{
float scaleWidth = 1f / scaleHeight;
Camera.main.rect = new Rect((1f - scaleWidth) / 2f, 0f, scaleWidth, 1f);
}
}
}
Erklärung:- targetAspect: Hier definierst du das Seitenverhältnis von 9:16.
- currentAspect: Berechnet das aktuelle Seitenverhältnis des Bildschirms.
- scaleHeight und scaleWidth: Berechnet, wie das Bild skaliert werden muss, um das gewünschte Seitenverhältnis zu erreichen.
- Das Skript stellt sicher, dass das Bild immer im gewünschten Seitenverhältnis angezeigt wird, selbst wenn das Gerät eine andere Auflösung oder ein anderes Seitenverhältnis hat.
- Kamera-Viewport anpassen: Das Skript passt das Viewport-Bereich der Kamera (
Camera.main.rect
- ) so an, dass das Bild immer im 9:16-Format bleibt. Wenn der Bildschirm ein anderes Seitenverhältnis hat, wird der Rest des Bildes als "Letterbox" oder "Pillarbox" angezeigt.
- Player Settings: In den
Player Settings
- kannst du auch die Auflösungen und Seitenverhältnisse für verschiedene Plattformen einstellen.
- Resolution & Presentation:
- Gehe zu
Edit -> Project Settings -> Player
- .
- Wähle die gewünschte Plattform aus (z. B. Android oder iOS).
- Unter
Resolution and Presentation
- kannst du verschiedene Bildschirmauflösungen und die Bildschirmorientierung für deine App festlegen.
Jedoch ist diese Methode nicht so flexibel wie ein Skript, da du die Auflösungen und Formate nicht dynamisch anpassen kannst, wenn sich das Gerät oder die Auflösung ändert.
Methode 4: Verhindern der Rotation (optional)Falls du auch die Rotation des Geräts verhindern möchtest, um das Seitenverhältnis zu erzwingen (z. B. das Spiel nur im Hochformat zu spielen), kannst du das in den Player-Einstellungen oder per Skript machen:
- Player Settings:
- Gehe zu
Edit -> Project Settings -> Player
- .
- Wähle die gewünschte Plattform und stelle sicher, dass unter
Resolution and Presentation
- die Rotation auf
Portrait
- eingestellt ist.
- Skript: Falls du dies im Skript umsetzen möchtest:
csharp
Kopieren
using UnityEngine;
public class LockOrientation : MonoBehaviour
{
void Start()
{
// Sperre die Ausrichtung auf Hochformat
Screen.orientation = ScreenOrientation.Portrait;
}
}
FazitDie Methode mit dem Skript, das das Seitenverhältnis im Kamerabereich anpasst, ist wahrscheinlich die flexibelste und dynamischste Lösung. So stellst du sicher, dass das 9:16-Format beibehalten wird, egal auf welchem Gerät das Spiel läuft.
Hoffe ich konnte helfen!
Yasin
Ich habe das jetzt versucht. Ich habe alle Versionen getestet. Am liebsten wäre mir die Methode mit dem Script. Ich habe es also eingefügt in ein MonoBehaviour Script gezogen und auf die Kamera gezogen. Hat nur leider nicht funktioniert. ): Was kann ich jetzt machen? Wenn ihr mehr wissen müsst um mir zu helfen, fragt einfach bitte. (;
Hast du das Skript an die richtige Kamera (Main Camera) angehängt?
Falls du mehrere Kameras hast, könnte das Skript auf einer falschen Kamera laufen.
Lösung:
Füge eine
Debug.Log()
-Meldung hinzu, um zu sehen, ob das Skript läuft:
csharp
KopierenBearbeiten
void Start()
{
Debug.Log("AspectRatioEnforcer gestartet!");
AdjustCamera();
}
Jetzt siehst du in der Unity-Konsole, ob das Skript wirklich ausgeführt wird.
Screen.width und Screen.height prüfenFalls sich nichts ändert, kann es sein, dass Unity die
Screen.width
und
Screen.height
noch nicht korrekt erkannt hat.
Lösung: Warte einen Frame, bevor du die Kamera anpasst:
csharp
KopierenBearbeiten
IEnumerator Start()
{
yield return null; // Einen Frame warten
Debug.Log($"Screen: {Screen.width}x{Screen.height}");
AdjustCamera();
}
Falls
Screen.width
und
Screen.height
falsche Werte haben, könnte das das Problem sein.
Kamera Viewport Rect erneut setzenFalls du Balken einfügen willst, stelle sicher, dass der
Camera.rect
korrekt gesetzt wird. Hier ist eine überarbeitete Version:
csharp
KopierenBearbeiten
using UnityEngine;
public class AspectRatioFixer : MonoBehaviour
{
private float targetAspect = 9f / 16f;
void Start()
{
AdjustCamera();
}
void AdjustCamera()
{
float windowAspect = (float)Screen.width / (float)Screen.height;
float scaleHeight = windowAspect / targetAspect;
Camera camera = Camera.main;
if (scaleHeight < 1.0f)
{
Rect rect = new Rect(0, (1.0f - scaleHeight) / 2.0f, 1.0f, scaleHeight);
camera.rect = rect;
}
else
{
float scaleWidth = 1.0f / scaleHeight;
Rect rect = new Rect((1.0f - scaleWidth) / 2.0f, 0, scaleWidth, 1.0f);
camera.rect = rect;
}
Debug.Log($"Kamera-Viewport gesetzt: {camera.rect}");
}
}
Falls du in Vollbild spielst, kann Unity den
Camera.rect
überschreiben! Dann musst du das Skript anpassen, um OnPreCull() oder OnGUI() zu nutzen.
Fixed Aspect Ratio mit UI-CanvasFalls dein Spiel viel UI nutzt, kannst du stattdessen den Canvas Scaler so einstellen:
- Wähle den
Canvas
- in Unity aus.
- Ändere
UI Scale Mode
- auf Scale With Screen Size.
- Setze
Reference Resolution
- auf
1080x1920
- .
- Setze
Screen Match Mode
- auf Expand oder Shrink.
So bleibt das UI stabil, unabhängig von der Bildschirmgröße.
Project Settings prüfenFalls das alles nicht hilft, könnte Unity selbst das Seitenverhältnis überschreiben:
- Gehe zu
Edit > Project Settings > Player
- Unter "Resolution and Presentation", stelle sicher:
Default Orientation
- ist Portrait
Fullscreen Mode
- ist nicht auf
Exclusive Fullscreen
Resolution Scaling Mode
- ist auf Fixed DPI
Teste das nochmal und sag mir, was genau passiert! Bekommst du schwarze Balken? Schneidet das Bild ab? Oder passiert gar nichts? 😊
4o
Ich habe das jetzt versucht. Ich habe alle Versionen getestet. Am liebsten wäre mir die Methode mit dem Script. Ich habe es also eingefügt in ein MonoBehaviour Script gezogen und auf die Kamera gezogen. Hat nur leider nicht funktioniert. ): Was kann ich jetzt machen? Wenn ihr mehr wissen müsst um mir zu helfen, fragt einfach bitte. (;
Danke für die Hilfe!