Unity: Spiel bleibt nicht im 9:16-Format- wie fixieren?

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 den
Aspect 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.

  1. Wähle das UI-Element, das du fixieren möchtest.
  2. Füge den
  3. Aspect Ratio Fitter
  4. -Komponenten zu diesem Element hinzu.
  5. Setze das Seitenverhältnis auf
  6. 9:16
  7. (0.5625).
Methode 2: Kamera anpassen (Hauptansicht fixieren)

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:

  1. 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.
  1. Kamera-Viewport anpassen: Das Skript passt das Viewport-Bereich der Kamera (
  2. Camera.main.rect
  3. ) 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.
Methode 3: Unity-Einstellungen für das Seitenverhältnis festlegen
  1. Player Settings: In den
  2. Player Settings
  3. kannst du auch die Auflösungen und Seitenverhältnisse für verschiedene Plattformen einstellen.
  4. 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:

  1. 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.
  1. 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;
    }
}
Fazit

Die 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


AlexNeu2007 
Beitragsersteller
 01.04.2025, 19:41

Danke für die Hilfe!

AlexNeu2007 
Beitragsersteller
 01.04.2025, 21:31
@AlexNeu2007

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. (;

Yasin383  02.04.2025, 06:42
@AlexNeu2007 Prüfen, ob das Skript richtig ausgeführt wird

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üfen

Falls 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 setzen

Falls 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-Canvas

Falls dein Spiel viel UI nutzt, kannst du stattdessen den Canvas Scaler so einstellen:

  1. Wähle den
  2. Canvas
  3. in Unity aus.
  4. Ändere
  5. UI Scale Mode
  6. auf Scale With Screen Size.
  7. Setze
  8. Reference Resolution
  9. auf
  10. 1080x1920
  11. .
  12. Setze
  13. Screen Match Mode
  14. auf Expand oder Shrink.

So bleibt das UI stabil, unabhängig von der Bildschirmgröße.

Project Settings prüfen

Falls das alles nicht hilft, könnte Unity selbst das Seitenverhältnis überschreiben:

  1. Gehe zu
    Edit > Project Settings > Player
  2. 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. (;