Масштабирование GUI под разные экраны

Общие вопросы о Unity3D

Масштабирование GUI под разные экраны

Сообщение DDDENISSS 14 сен 2012, 21:48

Начал делать меню и столкнулся с проблемой, что на экранах с разным соотношением сторон меню порой выглядит совсем неправильно(
Как лучше сделать автоматическую настройку компонентов?
В обычных GUI обычно используются панели, которые сами настраивают свое положение/разрешение и настраивают дочерние объекты. Кто-нибудь такое делал?
Я вот пока написал такой класс кнопки
Синтаксис:
Используется csharp
[ExecuteInEditMode]
public class GUIButton : MonoBehaviour {
       
        [SerializeField] private Texture texture;
        [SerializeField] private string text;
        private bool pressedDown = false;
       
        // Update is called once per frame
        void Update () {
                Vector2 mouse = Input.mousePosition;
                mouse.y = Screen.height - mouse.y;
                pressedDown = Input.GetMouseButtonDown(0) && GetRect().Contains(mouse);
        }
       
        void OnGUI() {
                if(Event.current.type != EventType.Repaint) return;
                GUI.DrawTexture( GetRect(), texture );
                GUI.Label( GetTextRect(), text );
        }
       
        private Rect GetRect() {
                float aspect = (float) texture.width / texture.height;
                float scale = Screen.height;
                float w = scale * transform.lossyScale.x / 4 * aspect;
                float h = scale * transform.lossyScale.y / 4;
               
                float x = Screen.width * transform.position.x - w/2;
                float y = Screen.height * transform.position.y - h/2;
                return new Rect(x, y, w, h);
        }
       
        private Rect GetTextRect() {
                Vector2 textSize = GUI.skin.label.CalcSize( new GUIContent(text) );
                Rect textRect = new Rect(0, 0, textSize.x, textSize.y);
                textRect.center = new Vector2(transform.position.x*Screen.width, transform.position.y*Screen.height);
                return textRect;
        }
       
        public bool IsPressedDown() {
                return pressedDown;
        }
       
}
 

Масштаб кнопки зависит только от Screen.height, поэтому в меню, в котором все кнопки по вертикали выглядит хорошо. Но не везде будет так просто т.к. от ширины экрана размер кнопки не зависит.
Кто-как делал такое?
Аватара пользователя
DDDENISSS
UNIверсал
 
Сообщения: 439
Зарегистрирован: 11 сен 2011, 20:33

Re: Масштабирование GUI под разные экраны

Сообщение vARDAmir 14 сен 2012, 23:03

лично я делаю кнопку вот так
Синтаксис:
Используется csharp
if(GUI.Button(new Rect(Screen.width * 0.91f, Screen.height * 0.85f, Screen.width * 0.09f, Screen.height * 0.15f),"Start"))

на телефоне с разрешением 800 на 480 выглядит квадратной, находится в нижнем правом углу. на всех 16:9(10) нормально смотрится.
Последний раз редактировалось waruiyume 14 сен 2012, 23:36, всего редактировалось 1 раз.
Причина: Спойлер мешал работе подсветки кода.
Весь код, найденный на форуме, буду использовать в коммерческих целях ^_^
vARDAmir
UNIт
 
Сообщения: 138
Зарегистрирован: 20 янв 2012, 22:07
Откуда: Россия, Сочи

Re: Масштабирование GUI под разные экраны

Сообщение DDDENISSS 15 сен 2012, 19:06

vARDAmir, во первых у тебя пропорции не сохраняются, во вторых, если какую-то систему из картинок надо создать, то так просто уже не сойдет.
Я кстати, в отдельном скрипте сделал кнопку, чтобы можно было ее анимировать при нажатии. Да и вместо текста лучше буду использовать готовую картинку.

Сделаю возможность выбора точки привязки. И несколько вариантов масштабирования, чтобы размер картинки зависел от ширины, высоты или от среднего значения ширины и высоты экрана. Думаю для простой игры должно пройти.
Аватара пользователя
DDDENISSS
UNIверсал
 
Сообщения: 439
Зарегистрирован: 11 сен 2011, 20:33


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18