Problemy z rozdzielczością przy przenoszeniu gry Unity na Androida

9

Więc po raz pierwszy portuję grę na Androida w Unity3D. Po drodze natknąłem się na kilka problemów. Mój obecny problem polega na tym, że rozdzielczość nie wydaje się odpowiednia, odcina krawędzie ekranu, a moje zatrzymywanie przewijania w lewo / w prawo nie jest już na właściwym miejscu.

Po przeprowadzeniu drobnych badań wiele osób twierdzi, że musisz ustawić grę jako niezależną od rozdzielczości, aby móc działać na wszystkich urządzeniach z Androidem / iPhonie / iPadzie. Czy to prawda? Jeśli tak, jak mam to zrobić? Jeśli nie, w jaki sposób mogę pomóc w rozwiązaniu problemu rozdzielczości, aby po przeniesieniu do urządzeń mobilnych wyglądało to poprawnie?

EDYCJA: Nadal nie mam tego, czego potrzebuję, rozdzielczości nadal nie działają poprawnie, nawet z kodem i sztuczkami wymienionymi poniżej. Potrzebuję sposobu na dostosowanie rozdzielczości w zależności od urządzenia. Z jakiegoś powodu, gdy próbuję odzyskać rozdzielczość urządzenia za pomocą kodu Mungoid, zwraca 0x0

Timothy Williams
źródło
1
Musisz przejść przez dowolny fragment kodu, który zakłada określoną rozdzielczość ekranu i zmienić ją, aby mogła przyjąć aktualną rozdzielczość ekranu i coś z tym zrobić. W zależności od tego, co robisz i jak, nie ma jednego uniwersalnego rozwiązania.
Tetrad
Jeśli chodzi o specyfikę, kwestia ta przechodzi w niektórych szczegółach (istnieje wiele pytań na ten temat na stronie) gamedev.stackexchange.com/questions/51/...
Tetrad
Ach, więc w zasadzie to, co powiedział Namar: „Upewnij się, że umieściłeś wszystko ze współczynnikami. Na przykład pasek zdrowia zostałby umieszczony na 80% szerokości ekranu z 10% szerokości ekranu dla jego skali poziomej”, więc jak mogę naprawić odniesienie konkretne obszary w kosmosie? Moje przewijanie ekranu opiera się na określonych obszarach w przestrzeni świata, ale wydaje się, że jest to pomieszane ze zmianami rozdzielczości.
Timothy Williams,
Czy mógłbyś bardziej szczegółowo określić swój problem? Mówisz, że rozdzielczość „wydaje się nieprawidłowa” i „nadal jest wyłączona” - ale rozdzielczość ekranu jest zwykle stałą właściwością urządzenia. Więc to nie rozdzielczość jest zła, ale sposób renderowania na ekranie. Jeśli przyjmiesz założenia dotyczące szerokości i wysokości ekranu, zawsze będziesz mieć problemy z różnymi urządzeniami i proporcjami obrazu.
Kylotan
Chyba naprawdę próbuję napisać kod, aby znaleźć najniższą rozdzielczość, ustawić grę i odpowiednio skalować wszystkie obiekty. Wiem, jak ustawić skalę pola gry, ale nie mogę uzyskać rozdzielczości urządzenia. dlatego gra jest „za bardzo powiększona” lub wszystko jest za duże.
Timothy Williams,

Odpowiedzi:

7

Problemem z Androidem jest to, że każde inne urządzenie ma własny rozmiar ekranu, rozdzielczość i gęstość pikseli. Jeśli chcesz, aby Twoja gra wyglądała identycznie na wszystkich urządzeniach, czeka Cię wiele pracy i prawdopodobnie nigdy nie będziesz zadowolony z rezultatów. Gra będzie rozciągnięta na ekranach szerokoekranowych lub skompresowana na ekranach niepanoramicznych. Sugeruję, abyś zdecydował, co jest naprawdę ważne, i pozwolił, by cokolwiek innego się nieco potoczyło.

Bez zrzutów ekranu lub wiedzy na temat Twojej gry i tego, jak ona wygląda, wszyscy możemy spekulować na temat rozwiązań, ale nie mamy konkretnego kierunku, aby udzielić konkretnej porady.

W Unity możesz uzyskać dostęp do wymiarów bieżącego ekranu za pomocą klasy Screen : Screen.widthi Screen.height(między innymi właściwościami). Następnie możesz zmienić współczynnik kształtu kamery , aby zmienić to, co jest widoczne na ekranach o różnych rozmiarach, w zależności od wymiarów ekranu i osobistych oczekiwań co do tego, co powinno być widoczne.

Jeśli musisz upewnić się, że ekrany HUD są odpowiednio skalowane, możesz to zrobić, zmieniając macierz transformacji GUI w oparciu o wymiary ekranu w każdej OnGUI()funkcji. Zrobiłem to wcześniej, tworząc ten prosty skrypt i dołączając go do wszystkiego, co renderowało elementy GUI, które chciałem skalować:

//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;
}

Następnie w rzeczywistych OnGUI()funkcjach od razu ustawiam macierz transformacji:

function OnGUI()
{
    GUI.matrix = guiScale.GetGUIMatrix();
    /* Everything Else */
}
chaosTechnician
źródło
Ustawienie proporcji aparatu na podstawie szerokości i wysokości ekranu nie pomaga, gdy telefon jest ustawiony pionowo, w ogóle się nie pokazuje, a gdy telefon jest ustawiony poziomo, pokazuje dokładnie to samo, co wcześniej. Gra jest podzielona na trzy sekcje, płynnie przewijasz palcami sekcje (jak w Angry Birds), oto zdjęcie, jak powinna wyglądać lewa strona. I środek . Oto lewa strona, gdy mój telefon jest trzymany pionowo ,
Timothy Williams
A tu poziomo . Mam nadzieję, że te zdjęcia mogą pomóc, to mój pierwszy port z Unity na Androida, a nawet tworzenie gry na Androida. Jestem trochę zagubiony.
Timothy Williams
Sądząc po (mojej interpretacji) twoich wyjaśnień i zdjęć, problemem nie jest rozwiązanie; Twój aparat nie znajduje się w miejscu, które może pokazać wszystko, co chcesz na małym ekranie. Zmniejsz poziomy lub cofnij aparat, aby pokazać więcej lub coś takiego. Sugeruję ustawienie okna gry na znacznie mniejszy rozmiar, aby reprezentował rozmiar rzeczywistego urządzenia zamiast rozmiaru 1230 x 530ish, który masz teraz, abyś mógł poczuć, co zobaczysz, gdy go przesuniesz.
chaosTechnician
Problem polega na tym, że już znacznie pomniejszyłem kamerę. Jeśli problem będzie się utrzymywał, jak mogę dokładnie uwzględnić różne ekrany i rozmiary i zmodyfikować je?
Timothy Williams
@TimothyWilliams, prawdopodobnie możesz coś rozwiązać, wybierając minimalną rozdzielczość (800 x 600 lub coś takiego), z którą gra współpracuje. Następnie użyj Screen.widthiw .heightpołączeniu z Camera.fieldOfViewi Camera.aspectaby odtworzyć ten sam widok na dowolnych rozmiarach ekranu. Wymagałoby to tylko jakiegoś wyzwalacza, aby dokładnie ustalić, jak to zrobić.
chaosTechnician
0

możesz spróbować czegoś takiego i zastosować to. Sądzę, że urządzenie mobilne powinno zwrócić tylko jedną rozdzielczość.

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);
};

Zajrzyj również tutaj, aby uzyskać więcej informacji na temat ekranu w jedności http://unity3d.com/support/documentation/ScriptReference/Screen.html

Mungoid
źródło
To mi nie pomogło, rozdzielczość jest nadal wyłączona.
Timothy Williams
Z jakiegoś powodu zwraca „0x0” na moim Androidzie ...
Timothy Williams