Lösungsprobleme beim Portieren eines Unity-Spiels auf Android

9

Also portiere ich zum ersten Mal in Unity3D ein Spiel auf Android. Und ich bin auf dem Weg auf ein paar Probleme gestoßen. Mein aktuelles Problem ist, dass die Auflösung nicht richtig zu sein scheint, die Ränder des Bildschirms abschneidet und meine Bildlaufstopps zum Scrollen des Bildschirms nach links / rechts nicht mehr an der richtigen Stelle sind.

Nach ein wenig Recherche sagen viele Leute, dass Sie Ihr Spiel Resolution Independent machen müssen, um auf allen Androids / Iphone / Ipad laufen zu können. Ist das wahr? Wenn ja, wie mache ich das? Wenn nicht, wie kann ich helfen, die Auflösung zu korrigieren, damit sie beim Portieren auf mobile Geräte richtig aussieht?

EDIT: Ich habe immer noch nicht wirklich das, was ich brauche, die Auflösungen funktionieren immer noch nicht richtig, selbst mit dem unten aufgeführten Code und den Tricks. Ich brauche eine Möglichkeit, um die Auflösung je nach Gerät anzupassen. Wenn ich versuche, die Auflösung eines Geräts mithilfe des Mungoid-Codes abzurufen, wird aus irgendeinem Grund 0x0 zurückgegeben

Timothy Williams
quelle
1
Sie müssen jeden Code durchgehen, der eine bestimmte Bildschirmauflösung voraussetzt, und ihn ändern, damit er die aktuelle Bildschirmauflösung annehmen und etwas damit anfangen kann. Je nachdem, was Sie tun und wie, gibt es keine einheitliche Lösung.
Tetrad
Was die Einzelheiten betrifft, geht diese Frage auf einige Details ein (es gibt viele Fragen dazu auf der Website). Gamedev.stackexchange.com/questions/51/…
Tetrad
Ahh, also im Grunde genommen, was Namar sagte: "Stellen Sie sicher, dass Sie alles mit Verhältnissen platzieren. Zum Beispiel würde ein Gesundheitsbalken bei 80% der Bildschirmbreite mit 10% der Bildschirmbreite für seine horizontale Skalierung platziert." Wie könnte ich also die Referenzierung korrigieren? bestimmte Bereiche im Raum? Mein Bildlauf auf dem Bildschirm basiert auf bestimmten Bereichen im Weltraum, aber das scheint mit den Auflösungsänderungen durcheinander zu kommen.
Timothy Williams
Könnten Sie Ihr Problem genauer beschreiben? Sie sagen, die Auflösung "scheint nicht richtig zu sein" und sie ist "immer noch ausgeschaltet" - aber die Bildschirmauflösung ist normalerweise eine feste Eigenschaft des Geräts. Es ist also nicht die Auflösung, die falsch ist, sondern die Art und Weise, wie Sie auf dem Bildschirm rendern. Wenn Sie davon ausgehen, wie breit und hoch der Bildschirm ist, haben Sie immer Probleme mit verschiedenen Geräten und Seitenverhältnissen.
Kylotan
Ich denke wirklich, ich versuche einen Code zu schreiben, um die niedrigste Auflösung zu finden, das Spiel darauf einzustellen und alle Objekte entsprechend zu skalieren. Ich weiß, wie man die Skalierung des Spielfelds einstellt, aber ich kann anscheinend die Auflösung des Geräts nicht ermitteln. Daher ist das Spiel "zu vergrößert" oder alles ist zu groß.
Timothy Williams

Antworten:

7

Ein Problem, auf das Sie bei Android stoßen, ist, dass jedes Gerät seine eigene Bildschirmgröße, Auflösung und Pixeldichte hat. Wenn Sie möchten, dass Ihr Spiel auf allen Geräten identisch aussieht, müssen Sie viel arbeiten und werden wahrscheinlich nie mit den Ergebnissen zufrieden sein. Entweder wird das Spiel auf Breitbild-Displays gestreckt oder auf Nicht-Widescreen-Displays komprimiert angezeigt. Ich schlage vor, Sie entscheiden, was wirklich wichtig ist, und lassen alles andere ein wenig gleiten.

Ohne Screenshots oder Wissen darüber, was Ihr Spiel ist und wie es aussieht, können wir alle über Lösungen spekulieren, aber wir haben keine spezifische Richtung, um Sie spezifisch zu beraten.

In Unity können Sie mit der Screen- Klasse: Screen.widthund Screen.height(unter anderem) auf die Abmessungen des aktuellen Bildschirms zugreifen . Sie können dann das Seitenverhältnis der Kamera ändern, um zu ändern, was auf Ihren unterschiedlich großen Bildschirmen angezeigt wird, basierend auf den Bildschirmabmessungen und Ihrer persönlichen Erwartung, was sichtbar sein soll.

Wenn Sie sicherstellen möchten, dass alle HUD-Anzeigen richtig skaliert sind, können Sie dies tun, indem Sie die GUI-Transformationsmatrix basierend auf den Bildschirmabmessungen in jeder OnGUI()Funktion ändern . Ich habe es zuvor getan, indem ich dieses einfache Skript erstellt und es an alles angehängt habe, was GUI-Elemente gerendert hat, die ich skalieren wollte:

//GUI values in code are assigned based on an 800x600 screen
private var nativeWidth : float = 800.0f;  
private var nativeHeight : float = 600.0f;
private var guiMatrix : Matrix4x4;

function Start () 
{
    var scale : Vector3 = Vector3(Screen.width / nativeWidth, 
                                  Screen.height / nativeHeight,
                                  1.0f);
    guiMatrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, scale);
}

function GetGUIMatrix() : Matrix4x4
{
    return guiMatrix;
}

Dann OnGUI()setze ich in den eigentlichen Funktionen sofort die Transformationsmatrix:

function OnGUI()
{
    GUI.matrix = guiScale.GetGUIMatrix();
    /* Everything Else */
}
ChaosTechniker
quelle
Das Einstellen des Seitenverhältnisses der Kamera basierend auf der Bildschirmbreite und -höhe hilft nicht. Wenn das Telefon vertikal ist, wird es überhaupt nicht angezeigt, und wenn das Telefon horizontal ist, wird es genauso angezeigt wie zuvor. Das Spiel ist in drei Abschnitte unterteilt. Sie können mit Ihrem Finger reibungslos zwischen den Abschnitten scrollen (wie in Angry Birds). Hier ist ein Bild davon, wie die linke Seite aussehen soll. Und die Mitte . Hier ist die linke Seite, wenn mein Telefon vertikal gehalten wird
Timothy Williams
Und hier ist horizontal . Hoffentlich können diese Bilder helfen. Dies ist mein erstes Mal, dass ich von Unity auf Android portiere oder sogar ein Android-Spiel mache. Ich bin ein bisschen verloren.
Timothy Williams
Nach (meinen Interpretationen) Ihrer Erklärungen und Ihrer Bilder zu urteilen, ist das Problem keine Lösung; Ihre Kamera befindet sich nicht an einem Ort, an dem möglicherweise alles, was Sie möchten, auf einem kleinen Bildschirm angezeigt werden kann. Verkleinern Sie Ihre Ebenen oder bewegen Sie Ihre Kamera zurück, um mehr oder etwas zu zeigen. Ich würde vorschlagen, dass Sie Ihr Spielfenster auf eine viel kleinere Größe einstellen , um die Größe eines tatsächlichen Geräts anstelle der Größe von 1230 x 530 zu repräsentieren, damit Sie ein Gefühl dafür bekommen, was Sie sehen, wenn Sie es verschieben.
ChaosTechnician
Das Problem ist, dass ich die Kamera bereits ziemlich stark herausgezoomt habe. Wenn dieses Problem weiterhin besteht, wie kann ich verschiedene Bildschirme und Größen genau berücksichtigen und daran ändern?
Timothy Williams
@TimothyWilliams, Sie könnten wahrscheinlich etwas herausfinden, indem Sie eine minimale Auflösung (800x600 oder so) auswählen, mit der Ihr Spiel funktioniert. Verwenden Sie dann Screen.widthund .heightzusammen mit Camera.fieldOfViewund Camera.aspect, um dieselbe Ansicht auf beliebigen Bildschirmgrößen zu reproduzieren. Es würde nur einige Trigger erfordern, um genau herauszufinden, wie es geht.
ChaosTechnician
0

Sie könnten etwas wie das Folgende versuchen und es anwenden. Ich würde vermuten, dass ein mobiles Gerät nur eine Auflösung zurückgeben sollte.

function Start()
{
    var resolutions : Resolution[] = Screen.resolutions;
    // Print the resolutions
    for (var res in resolutions) {
        print(res.width + "x" + res.height);
    }
    // Switch to the lowest supported fullscreen resolution
    Screen.SetResolution (resolutions[0].width, resolutions[0].height, true);
};

Weitere Informationen zum Bildschirm in Unity finden Sie hier unter http://unity3d.com/support/documentation/ScriptReference/Screen.html

Mungoid
quelle
Das hat mir nicht geholfen, die Auflösung ist noch aus.
Timothy Williams
Es gibt "0x0" auf meinem Android aus irgendeinem Grund zurück ...
Timothy Williams