GUI.Matrix One GUI to rule them all! [C#] 4282 5

O temacie

Autor Sawik

Zaczęty 19.06.2014 roku

Wyświetleń 4282

Odpowiedzi 5

Sawik

Sawik

Użytkownicy
Rebel
posty4772
Propsy3197
ProfesjaNierób
  • Użytkownicy
  • Rebel
Tutorial badający czy w ogóle nadaję się do pisania takich rzeczy, oraz czy jest sens się produkować.

Spotkaliście się kiedyś z problemem, że Wasze GUI rozjeżdżało się na innych rozdzielczościach? Tak? To właśnie się nauczycie jak temu zapobiec.
Bez zbędnych ceregieli:
Potrzebujemy trzech zmiennych:
float org_width= 1024.0f; 
float org_height= 768.0f;
Vector3 scale;
org_width i org_height są odpowiednikami oryginalnej rozdzielczości na której pisaliście swoje GUI. Zwróćcie uwagę na fakt że są one floatami, pomimo faktu że sama rozdzielczość jest liczbą całkowitą.
Vector3 jest nam potrzebny do zapisania skali.

scale.x = Screen.width/org_width;
scale.y = Screen.height/org_height;
scale.z = 1;
Ustawiamy skalę, x to szerokość (width), a y to wysokość (height), skali z nie zmieniamy, jednak musimy ją przypisać ponieważ domyślnie jest zero.
Wartości które przypisujemy powinny być oczywiste, obecna rozdzielczość, podzielona przez oryginalną. Dzięki temu że nasze oryginalne rozmiary zapisaliśmy jako liczby zmiennoprzecinkowe, wynik również jest zwracany w tej formie.
Matrix4x4 org_matrix = GUI.matrix;
GUI.matrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, scale);
//Operacje na GUI
GUI.matrix = org_matrix;
Tworzymy zmienną typu Matrix4x4, ja nazwałem ją "org_matrix" i przypisujemy jej GUI.matrix, zanim go zmienimy, na końcu przywracamy oryginalny matrix, jeżeli tego nie zrobimy możemy doświadczyć niemiłych problemów z nie wyświetlającymi się elementami.
Matrix4x4.TRS przyjmuje trzy parametry, translation, rotation i scale, stąd nazwa. Ponieważ nie chcemy zmieniać pozycji ani rotacji, je zostawiamy bez zmian, natomiast skalę zastępujemy naszą własną przypisaną wcześniej.

Dla tego tutorialu wystarczy wywoływanie całości w OnGUI():
void OnGUI ()
{

scale.x = Screen.width/org_width;
scale.y = Screen.height/org_height;
scale.z = 1;
Matrix4x4 org_matrix = GUI.matrix;
GUI.matrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, scale);
//Operacje na GUI
GUI.matrix = org_matrix ;

}

No i to by było na tyle. Czekam na jakiś feedback z Waszej strony odnośnie błędów, chociaż mam nadzieję że takowych nie ma i przystępności tekstu.
 
Życzę wam seksu analnego po stronie biernej.
Dropbox +500 mb na start
LowPoly
Wykonanie modelu niskopoligonowego to sztuka kompromisu. Nie jest to jedynie uproszczenie modelu wysokopoligonowego, ale głęboka modyfikacja oraz podejmowanie decyzji często zmieniających wygląd pierwotny obiektu, tak by przy najmniejszej ilości trójkątów uzyskać jak najwierniej odwzorowany kształt oryginału. Nie można też zapomnieć o tym iż musi nadal wyglądać przekonywająco i tak balansować by uzyskać efekt optymalny.

Podstawowym założeniem jest, że model nie powinien mieć zbędnych, niewidocznych dla gracza detali włączonych w geometrie. Większość obiektów jakie znajdują się w grze powinna prezentować się najlepiej z odległości około 3-5 metrów. Wszelkie detale, które zanikają, wydają się płaskie lub zlewają się z bryłą modelu należy uznać za zbędne i pozostawić je na normal mapie.

Fakt, iż gracz będzie w stanie podejść bliżej do obiektu i zobaczyć go z mniejszej niż 3m odległości nie powinno stanowić większego problemu, gdyż większą rolę odgrywają wtedy tekstury oraz dodatkowy detal zależny od materiału obiektu. To właśnie kompromis między wydajnością, a szczegółowością otoczenia.

Detal, którego nie widać z 3-5 metrów nie powinnien istnieć w geometrii modelu.
Krawędzie znajdujące się blisko siebie, które zlewają się z większej odległości należy uprościć do wspólnej płaszczyzny

Remix

Remix

Użytkownicy
Murzyn Internetów :O
posty291
Propsy41
ProfesjaProgramista
  • Użytkownicy
  • Murzyn Internetów :O
Całość zrobiona bardzo fajnie tyle że czemu nie użyjesz stałych do zapisywania oryginalnej rozdzielczości skoro ona się nie zmienia? (Co prawda nie bawię się w Unity ale ja bym chyba zapisał te dane w postaci stałych)
 
https://www.youtube.com/watch?v=TNdy0ea6gc4

Sawik

Sawik

Użytkownicy
Rebel
posty4772
Propsy3197
ProfesjaNierób
  • Użytkownicy
  • Rebel
Po prostu niedopatrzenie. 
Z jakiegoś powodu od zawsze nie przepadałem za używaniem stałych. 
 
Życzę wam seksu analnego po stronie biernej.
Dropbox +500 mb na start
LowPoly
Wykonanie modelu niskopoligonowego to sztuka kompromisu. Nie jest to jedynie uproszczenie modelu wysokopoligonowego, ale głęboka modyfikacja oraz podejmowanie decyzji często zmieniających wygląd pierwotny obiektu, tak by przy najmniejszej ilości trójkątów uzyskać jak najwierniej odwzorowany kształt oryginału. Nie można też zapomnieć o tym iż musi nadal wyglądać przekonywająco i tak balansować by uzyskać efekt optymalny.

Podstawowym założeniem jest, że model nie powinien mieć zbędnych, niewidocznych dla gracza detali włączonych w geometrie. Większość obiektów jakie znajdują się w grze powinna prezentować się najlepiej z odległości około 3-5 metrów. Wszelkie detale, które zanikają, wydają się płaskie lub zlewają się z bryłą modelu należy uznać za zbędne i pozostawić je na normal mapie.

Fakt, iż gracz będzie w stanie podejść bliżej do obiektu i zobaczyć go z mniejszej niż 3m odległości nie powinno stanowić większego problemu, gdyż większą rolę odgrywają wtedy tekstury oraz dodatkowy detal zależny od materiału obiektu. To właśnie kompromis między wydajnością, a szczegółowością otoczenia.

Detal, którego nie widać z 3-5 metrów nie powinnien istnieć w geometrii modelu.
Krawędzie znajdujące się blisko siebie, które zlewają się z większej odległości należy uprościć do wspólnej płaszczyzny

Remix

Remix

Użytkownicy
Murzyn Internetów :O
posty291
Propsy41
ProfesjaProgramista
  • Użytkownicy
  • Murzyn Internetów :O
Po prostu niedopatrzenie.
Z jakiegoś powodu od zawsze nie przepadałem za używaniem stałych.

Heh twój wybór,  To już kwestia programisty, ja zawsze i tak kierowałem się zasadą: "ważne że działa" :D
 
https://www.youtube.com/watch?v=TNdy0ea6gc4

inż. Avallach

inż. Avallach

Administrator
posty7662
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator
Zapisać można by całą macierz konwersji.
const Matrix4x4 guiMatrix = Matrix4x4.Scale(new Vector3(Screen.width/1024.0f, Screen.height/768.0f, 1));Swoją drogą obawiam się że to nie jest dobre podejście do tworzenia gui (choć proste).

Kuba90

Kuba90

Użytkownicy
JunityMan
posty226
Propsy93
Profesjabrak
  • Użytkownicy
  • JunityMan
Witam ja robię to zupełnie inaczej . Nie do końca wiem jak z wydajnością tej metody - póki co nie miałem z tym problemów
var w : flota;///width - szerokość, 1 to 100% wielkośći ekranu , 0.1 to 10% itp///
var h : float;///height - wysokość, analogicznie///
private var rect : Rect;
function OnGUI(){
rect.x = (Screen.width*(1-w))/2;////takie coś da ci dolny środek////
rect.y = (Screen.height*(1-h));
rect.width = Screen.width*w;
rect.height = Screen.height*h;
///////teraz dodaj jakiś elemnt gui//////
GUI.Box(rect,"Napis");
}
ale to UnityScript nie c#
 


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry