Подстраиваем GUI под разные разширения с помощью структуры Matrix4x4
Видео вариант урока
Наверное у многих извас, кто пользуется стандартным GUI возникали проблемы при расположении элементов интерфейса,
так что бы при изменении расширения они оставались в назначенном им месте. Выходом из этой
ситуации было вводить кучу вспомогательных переменных и с помощью них
отталкиваясь от Screen.width и Screen.height вычеслять место
положение. Но есть немного проще способ, это использование структуры Matrix4x4. Как вы уже
поняли это матрица с 4 строками и 4 стоблаци. Дальше мы и разберем небольшой
пример ее использования
Для начала зададим размер экрана 800х600.
Теперь создаем скрипт TestGUI. И в нем для примера создадим несколько кнопок вряд и
введем публичную переменную Position
для регулировки положения на экране
Код
using UnityEngine;
using System.Collections;
public class TestGUI : MonoBehaviour {
publicfloat Position;
voidStart () {
}
voidOnGUI()
{
for(int i = 0; i < 6; i++)
{
GUI.Button(new Rect(5 + (i * 80), Position, 80, 80), "Кнопка " +i.ToString());
}
}
}
Вешаем скрипт на
камеру. Переходим в режим 800х600 и запускаем игру. Регулируя переменную
настроим положение кнопок в левом нижнем углу. Окно Game разворачиваем на весь экран
Попробуемизменить разрешение на любое другое. Я к примеру установил 1680х1050 И что же
мы видим
Наши кнопки
сьехали при изменении расширения. Сейчас мы это будем исправлять. Возвращаемся
в наш список и вводим переменную типа Vector2
В Start присваиваем этой переменной значения максимального
допустимого у нас расширения экрана, которое возможно будет в игре
Код
using UnityEngine;
using System.Collections;
public class TestGUI : MonoBehaviour {
publicfloat Position;
Vector2screen;
voidStart () {
screen.x = 1920;
screen.y = 1080;
}
voidOnGUI()
{
for(int i = 0; i < 6; i++)
{
GUI.Button(new Rect(5 + (i * 80), Position, 80, 80), "Кнопка " +i.ToString());
}
}
}
Теперь создадим
метод где и будем изменять Matrix4x4
Код
void Resize()
{
Vector2 ratio = new Vector2(Screen.width / screen.x, Screen.height /screen.y);
Matrix4x4 guiMatrix = Matrix4x4.identity;
guiMatrix.SetTRS(new Vector3(1, 1, 1), Quaternion.identity, newVector3(ratio.x, ratio.y, 1));
GUI.matrix = guiMatrix;
}
Давайте
разберемся, что мы сделали. Первым делом мы создали переменную типа Vector2 и присвоили ей
значение. Вторая строчка мы создаем матрицу в 4 строки и в 4 столбца(Matrix4x4) и присваиваем
ей значение Matrix4x4.identity.
Matrix4x4.identity
это матрица у которой значения по диагонали равны 1
С помощью SetTRS задаем необходимое положение, размер.
Теперь перед созданием кнопок необходимо запустить наш
метод Resize() для перерасчета местоположения.
А после всех вычеслений присвоить Matrix4x4 значение identity.
Код
using UnityEngine;
using System.Collections;
public class TestGUI : MonoBehaviour {
publicfloat Position;
Vector2screen;
voidStart () {
screen.x = 1920;
screen.y = 1080;
}
voidOnGUI()
{
Resize();
for(int i = 0; i < 6; i++)
{
GUI.Button(new Rect(5 + (i * 80), Position, 80, 80), "Кнопка " +i.ToString());
}
GUI.matrix = Matrix4x4.identity;
}
voidResize()
{
Vector2 ratio = new Vector2(Screen.width / screen.x, Screen.height /screen.y);
Matrix4x4 guiMatrix = Matrix4x4.identity;
guiMatrix.SetTRS(new Vector3(1, 1, 1), Quaternion.identity, newVector3(ratio.x, ratio.y, 1));
GUI.matrix = guiMatrix;
}
}
Запускаем игру и пробуем опятьрасположить наши кнопки в левом нижнем углу. После того, как расположили их,
меняеем расширение на другом и видим, что кнопки сохранили свое положение
Все очень просто и примитивно, но я надеюсь кто то этого не знал и урок будет полезным