Odpowiednia rozdzielczość dla obrazu dla menu

Shadery i tematy z nimi związane.

Odpowiednia rozdzielczość dla obrazu dla menu

Postprzez Reboot » 27 Sie 2014, 20:48

Witam
Postanowiłem zrobić menu do gry. jednak mam pytanie: jakiej odpowiedniej wielkości powinien być obrazek służący jako tło do menu, tak aby nie był rozpixelowany? Na jakim obiekcie wstawić ten obrazek (Cube, Plane)?
Reboot
 
Posty: 117
Rejestracja: 26 Sie 2014, 20:31
Has thanked: 0 time
Been thanked: 0 time

Re: Odpowiednia rozdzielczość dla obrazu dla menu

Postprzez Xingu » 27 Sie 2014, 23:40

Możesz np. założyć że maksymalna rozdzielczość ekranu to 1920x1080 (full HD) i przygotować menu pod taką rozdzielczość. Potem tylko skalować. Jeżeli ktoś będzie grał na mniejszej, obrazek się przeskaluje w dół, czyli nie straci na jakości. Wada? Niezależnie od rozdziałki, ładujesz duży obrazek. Do tego, nie jestem pewny, ale przy zmianie proporcji obrazu, przycisk może się rozjechać, ale raczej nie powinno.

A do stworzenia menu, obrazek powinien być Texturą2D nałożoną na obiekt typu GUI Button, w funkcji OnGUI, jeśli chodzi o aktywne elementy. Zaś statyczne jak tło, po po prostu Tekstura2D.
Awatar użytkownika
Xingu
 
Posty: 412
Rejestracja: 18 Lip 2013, 20:11
Miejscowość: Kraków
Has thanked: 0 time
Been thanked: 0 time

Re: Odpowiednia rozdzielczość dla obrazu dla menu

Postprzez Reboot » 28 Sie 2014, 20:59

W menu nie ma sie nic przesuwać.
Zrobiłem teksturę 1920X1080 i dodałem do unity. Na co ja mam ją nałożyć? Próbowałem na plane'a ale to chyba kiepski pomysł.
Reboot
 
Posty: 117
Rejestracja: 26 Sie 2014, 20:31
Has thanked: 0 time
Been thanked: 0 time

Re: Odpowiednia rozdzielczość dla obrazu dla menu

Postprzez superpawelTV » 28 Sie 2014, 22:00

Tworzysz pusty GameObject, wrzucasz ten skrypt na niego i przypisujesz swoją teksturę.
Kod: Zaznacz wszystko
public Texture2D Tex;
void OnGUI()
{
     GUI.DrawTexture(new Rect(0, 0, Screen.width, Screen.height), Tex, ScaleMode.ScaleToFit); //ew. ScaleMode.ScaleAndCrop, popatrz co Ci lepiej odpowiada.
}
superpawelTV
 
Posty: 87
Rejestracja: 03 Gru 2012, 19:01
Has thanked: 0 time
Been thanked: 0 time

Re: Odpowiednia rozdzielczość dla obrazu dla menu

Postprzez Reboot » 29 Sie 2014, 17:55

Obie funkcje ucinają obraz przy jakiejkolwiek rozdzielczości. Poza tym mam jeszcze jeden problem.
Otóż napisałem skrypt dla przycisków w menu. Jednak za każdym razem, w innej rozdzielczości, są one w innym położeniu. Jak to naprawić?

Kod: Zaznacz wszystko
using UnityEngine;
using System.Collections;

public class Menu_View : MonoBehaviour {

   public Texture2D Tekstura;

   public Rect Przycisk1 = new Rect (570,250,150,50);
   public Rect Przycisk2 = new Rect (570,310,150,50);
   public Rect Przycisk3 = new Rect (570,370,150,50);

   public string Przycisk_Nazwa1="Start";
   public string Przycisk_Nazwa2="Options";
   public string Przycisk_Nazwa3="Exit";

   public string Przycisk_Poziom1 = "Level 1";
   public string Przycisk_Poziom2 = "Options";

   void OnGUI()
   {
      GUI.DrawTexture(new Rect(0, 0, Screen.width, Screen.height), Tekstura, ScaleMode.ScaleToFit);

      if (GUI.Button (Przycisk1,Przycisk_Nazwa1)) {
         Application.LoadLevel("Level 1");
            }
      if (GUI.Button (Przycisk2,Przycisk_Nazwa2)) {
         Application.LoadLevel("Level 1");
      }
      if (GUI.Button (Przycisk3, Przycisk_Nazwa3)) {
         Application.Quit();
            }
                  
                                 
   }
}


Wiem, że powinienem użyć tablic, ale kod pisany na szybko.
Reboot
 
Posty: 117
Rejestracja: 26 Sie 2014, 20:31
Has thanked: 0 time
Been thanked: 0 time

Re: Odpowiednia rozdzielczość dla obrazu dla menu

Postprzez bajtek » 29 Sie 2014, 18:46

Nie dziwne że są w innym położeniu w innej rozdzielczości bo nadajesz im położenie w pikselach
new Rect (570,250,150,50);

Czyli twój napis będzie się zaczynał na 570tym pikselu w prawo i 250tym pikselu w dół. Więc przykładowo jak ekran ma szerokość 1024px to zacznie się on mniej więcej w połowie. A jak ekran miałby 640px to już byłby na jego końcu. Dlatego położenie najlepiej określać procentowo czyli przykładowo jak chcesz żeby tekst był w połowie ekranu to powinnno być: Screen.width*0.5 zamiast tego 570.
No i prawdopodobnie tekst zacznie się wtedy w połowie a chcesz żeby był wyśrodkowany. Ja sobie radzę w ten sposób że odejmuję jeszcze połowę szerokości pola tekstowego, czyli na Twoim przykładzie by było: Screen.width*0.5-75, bo u Ciebie jest szerokość wpisana 150 więc połową będzie 75. Ale ogólnie lepiej wszystko zapisywać w procentach niż w pikselach, więc także szerokości i wysokości pól tekstowych żeby błędów nie było i zawsze miały taką samą wielkość względem ekranu.
Awatar użytkownika
bajtek
 
Posty: 212
Rejestracja: 09 Paź 2013, 06:16
Has thanked: 0 time
Been thanked: 0 time

Re: Odpowiednia rozdzielczość dla obrazu dla menu

Postprzez Reboot » 29 Sie 2014, 19:48

Zrobiłem coś takiego i działa, tylko przyciski są wielkie, nie takie jak bym chciał. Jak to wyedtować tak, abym wielkość mógł ustalić sam, jednocześnie zachowując justowanie przycisków?

Kod: Zaznacz wszystko
void OnGUI()
   {
      GUI.DrawTexture(new Rect(0, 0,Screen.width, Screen.height), Tekstura);

      if (GUI.Button (new Rect (Screen.width * 0.25, Screen.height * 0.5, Screen.width * 0.5, Screen.height * 0.1), "Start")) {
         Application.LoadLevel(1);
            }
                  
                                 
   }
Reboot
 
Posty: 117
Rejestracja: 26 Sie 2014, 20:31
Has thanked: 0 time
Been thanked: 0 time

Re: Odpowiednia rozdzielczość dla obrazu dla menu

Postprzez Reboot » 29 Sie 2014, 21:31

EDIT:
Mam jeszcze taki kod:

Kod: Zaznacz wszystko
if (GUI.Button (new Rect ((Screen.width / 2) - (szer_przycisku/2),280,szer_przycisku,wys_przycisku),"Start"))  {
         Application.LoadLevel(1);
            }

Działa, tylko znowu są kłopoty przy zmianie rozdzielczości - NIE JEST NA ŚRODKU!
Reboot
 
Posty: 117
Rejestracja: 26 Sie 2014, 20:31
Has thanked: 0 time
Been thanked: 0 time

Re: Odpowiednia rozdzielczość dla obrazu dla menu

Postprzez superpawelTV » 29 Sie 2014, 22:56

Możesz wypróbować tą oto klasę, działa jak Rect (czyli zamiast Rect, dajesz po prostu ScaledRect) ale skaluje kontrolki automatycznie. Tylko uwaga, nie zawsze są one zeskalowane co do piksela oraz jest przewidziany dla proporcji 16:9 ale edycja nie będzie ciężka.

Kod: Zaznacz wszystko
//ScaledRect by Nick Tziamihas ( http://wiki.unity3d.com/index.php/ScaledRect )
//C# translation: superpawelTV

public class ScaledRect
{
    public ScaledRect(float x, float y, float width, float height)
    {
        this.x = (x * Screen.width) / 1920;
   this.y = (y * Screen.height) / 1080;
   this.width = (width * Screen.width) / 1920;
   this.height = (height * Screen.height) / 1080;
    }

     public float x;
     public float y;
     public float width;
     public float height;
     
     public static implicit operator Rect(ScaledRect r)
     {
          return new Rect(r.x, r.y, r.width, r.height);
     }
     public static implicit operator ScaledRect(Rect r)
     {
          return new ScaledRect(r.x, r.y, r.width, r.height);
     }
}
superpawelTV
 
Posty: 87
Rejestracja: 03 Gru 2012, 19:01
Has thanked: 0 time
Been thanked: 0 time

Re: Odpowiednia rozdzielczość dla obrazu dla menu

Postprzez Reboot » 02 Wrz 2014, 20:54

Mam jeszcze jedno pytanie: jaka powinna być rozdzielczość tekstury, którą chcę nanieść na obiekt, tak aby na tym obiekcie nie była rozpixelowana? Nakładam ją na Cube'a (nie wiem, czy jest jakiś lepszy obiekt).
Reboot
 
Posty: 117
Rejestracja: 26 Sie 2014, 20:31
Has thanked: 0 time
Been thanked: 0 time

Następna

Wróć do Shader Lab

Kto jest na forum

Użytkownicy przeglądający to forum: Brak zarejestrowanych użytkowników oraz 1 gość

cron