Unity 6.3
0 онлайн 26 гостей 3 в системе
Вход

IMGUI Основа

В этом разделе описан минимум, необходимый для создания скриптов элементов управления с помощью системы Immediate Mode GUI (IMGUI) в Unity.

Создание контроля с помощью IMGUI

Элементы управления IMGUI в Unity используют специальную функцию OnGUI(). Функция OnGUI() вызывается в каждом кадре, пока содержащий её скрипт включён, как и функция Update().

Контроллеры IMGUI сами по себе очень просты по структуре. Эта структура очевидна в следующем примере.

/* Example level loader */
using UnityEngine;
using System.Collections;

public class GUITest : MonoBehaviour {
            
    void OnGUI ()
    {
        // Make a background box
        GUI.Box(new Rect(10,10,100,90), "Loader Menu");
    
        // Make the first button. If it is pressed, Application.Loadlevel (1) will be executed
        if(GUI.Button(new Rect(20,40,80,20), "Level 1"))
        {
            Application.LoadLevel(1);
        }
    
        // Make the second button.
        if(GUI.Button(new Rect(20,70,80,20), "Level 2")) 
        {
            Application.LoadLevel(2);
        }
    }
}

Этот пример является полным, функциональным загрузчиком уровней. Если вы скопируете/вставляете этот скрипт и прикрепляете его к GameObject, Вы увидите следующее меню появится, когда вы введете Режим игры:

Меню загрузчика, созданное примером кода

Давайте посмотрим на детали примера кода:

Первая строка GUI, GUI.Box (Rect (10,10,100,90), “Loader Menu”); отображает Коробка Control с текстом заголовка “Loader Menu”. Она следует типичной схеме декларирования GUI Control, которую мы рассмотрим в ближайшее время.

Следующий GUI линия является Кнопка Объявление контроля. Обратите внимание, что оно немного отличается от объявления контроля Box. В частности, все объявление Button помещается внутрь если заявление. Когда игра работает и кнопка нажата, это если возвращает true и любой код внутри если блок выполняется.

Поскольку код OnGUI() вызывает каждый кадр, вам не нужно явно создавать или уничтожать элементы управления GUI. Строчка, объявляющая элемент управления, является той же, что и строка, создающая его. Если вам нужно отображать элементы управления в определенное время, вы можете использовать для этого любую логику скриптов.

/* Flashing button example */
using UnityEngine;
using System.Collections;

public class GUITest : MonoBehaviour
{
            
    void OnGUI () 
    {
        if (Time.time % 2 < 1) 
        {
            if (GUI.Button (new Rect (10,10,200,20), "Meet the flashing button"))
            {
                print ("You clicked me!");
            }
        }
    }
}

Здесь GUI.Button() вызывается только каждые две секунды, так что кнопка будет появляться и исчезать. Естественно, пользователь может нажать на нее только тогда, когда кнопка видна.

Как видите, вы можете использовать любую логику, чтобы контролировать, когда GUI Controls отображаются и функционируют. Теперь мы рассмотрим детали объявления каждого Control.

Анатомия управления

Существует три ключевых элемента информации, требуемые при объявлении GUI Control:

Тип (Позиция, Содержание)

Обратите внимание, что эта структура является функцией с двумя аргументами. Теперь мы рассмотрим детали этой структуры.

Тип

Тип — это тип элемента управления, объявляемый вызовом функции класса GUI или GUILayout в Unity. Эти классы подробно рассматриваются в разделе руководства Режимы компоновки. Например, GUI.Label() создаёт неинтерактивную метку. Все типы элементов управления описаны далее в разделе руководства Элементы управления.

Позиция

Позиция является первым аргументом в любой GUI Control функции. Сам аргумент предоставляется с Rect() функции. Rect() определяет четыре свойства: крайняя левая позиция, верхняя позиция, общая ширина, общая высота. Все эти значения предоставляются в целых числах, которые соответствуют значениям пикселей. Все UnityGUI контроллеры работают в Screen Space, что является разрешением опубликованного проигрывателя в пикселях.

Rect(10, 20, 300, 100) определяет Прямоугольник, который начинается на координатах: 10,20 и заканчивается на координатах 310,120. Стоит повторить, что вторая пара значений в Rect() представляет собой общую ширину и высоту, а не координаты, где заканчиваются элементы управления. Вот почему упомянутый выше пример заканчивается на 310,120, а не на 300,100.

Вы можете использовать свойства Screen.width и Screen.height для получения общих размеров экранного пространства, доступного в проигрывателе. Следующий пример может помочь прояснить, как это делается:

/* Screen.width & Screen.height example */
using UnityEngine;
using System.Collections;

public class GUITest : MonoBehaviour 
{
            
    void OnGUI()
    {
        GUI.Box (new Rect (0,0,100,50), "Top-left");
        GUI.Box (new Rect (Screen.width - 100,0,100,50), "Top-right");
        GUI.Box (new Rect (0,Screen.height - 50,100,50), "Bottom-left");
        GUI.Box (new Rect (Screen.width - 100,Screen.height - 50,100,50), "Bottom-right");
    }

}
Клетки, расположенные в вышеприведенном примере
Клетки, расположенные в вышеприведенном примере

Содержание

Второй аргумент для GUI Контроллера — это фактическое содержимое, которое должно быть отображено с помощью Контроллера. Чаще всего вы будете хотеть отобразить текст или изображение на вашем Контроллере. Чтобы отобразить текст, передайте строку в качестве аргумента Content следующим образом:

using UnityEngine;
using System.Collections;

public class GUITest : MonoBehaviour 
{
    void OnGUI ()
    {
        GUI.Label (new Rect (0,0,100,50), "This is the text string for a Label Control");
    }
}

Чтобы отобразить изображение, объявьте Texture2D открытую переменную и передайте её имя как аргумент content вот так:

/* Texture2D Content example */
public Texture2D controlTexture;
  ...

void OnGUI () 
{
    GUI.Label (new Rect (0,0,100,50), controlTexture);
}

Вот пример, более близкий к реальному сценарию:

/* Button Content examples */
using UnityEngine;
using System.Collections;

public class GUITest : MonoBehaviour
{
    public Texture2D icon;
    
    void OnGUI () 
    {
        if (GUI.Button (new Rect (10,10, 100, 50), icon)) 
        {
            print ("you clicked the icon");
        }
    
        if (GUI.Button (new Rect (10,70, 100, 20), "This is text")) 
        {
            print ("you clicked the text button");
        }
    }
}
Кнопки, созданные вышеприведенным примером
Кнопки, созданные вышеприведенным примером

Существует третья опция, которая позволяет отображать изображения и текст вместе в GUI Контроллере. Вы можете предоставить объект GUIContent в качестве аргумента Content и определить строку и изображение, которые будут отображаться в GUIContent.

/* Using GUIContent to display an image and a string */
using UnityEngine;
using System.Collections;

public class GUITest : MonoBehaviour
{
    public Texture2D icon;

    void OnGUI () 
    {
        GUI.Box (new Rect (10,10,100,50), new GUIContent("This is text", icon));
    }
}

Вы также можете определить подсказку Подсказка в GUIContent, и отобразить ее в другом месте GUI, когда мышка будет находиться над ней.

/* Using GUIContent to display a tooltip */
using UnityEngine;
using System.Collections;

public class GUITest : MonoBehaviour 
{
    void OnGUI () 
    {
        // This line feeds "This is the tooltip" into GUI.tooltip
        GUI.Button (new Rect (10,10,100,20), new GUIContent ("Click me", "This is the tooltip"));
        
        // This line reads and displays the contents of GUI.tooltip
        GUI.Label (new Rect (10,40,100,20), GUI.tooltip);
    }
}

Вы также можете использовать GUIContent для отображения строки, значка и tooltip.

/* Using GUIContent to display an image, a string, and a tooltip */
using UnityEngine;
using System.Collections;

public class GUITest : MonoBehaviour 
{
    public Texture2D icon;
    
    void OnGUI () 
    {
        GUI.Button (new Rect (10,10,100,20), new GUIContent ("Click me", icon, "This is the tooltip"));
        GUI.Label (new Rect (10,40,100,20), GUI.tooltip);
    }
}

На справочной странице скрипта для конструктора GUIContent приведены некоторые примеры его использования.