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

Расширение IMGUI

Существует множество способов использования и расширения системы IMGUI в соответствии с вашими потребностями. Контроллеры могут быть смешаны и созданы, и у вас есть много возможностей для диктования того, как ввод пользователя в GUI обрабатывается.

Композитный контроль

В вашем GUI могут возникать ситуации, когда два типа Контроля всегда появляются вместе. Например, возможно, вы создаете экран создания персонажа с несколькими Горизонтальными Слайдерами. Все эти Слайдеры нуждаются в Метке, чтобы идентифицировать их, так что игрок знает, что они регулируют. В этом случае вы можете объединить каждый вызов GUI.Label() с вызовами GUI.HorizontalSlider(), или вы можете создать Составной Контроль, который включает в себя и Метку и Слайдер вместе.

// Label and Slider Compound Control

using UnityEngine;
using System.Collections;

public class GUITest : MonoBehaviour {
        
    private float mySlider = 1.0f;
    
    void OnGUI () {
        mySlider = LabelSlider (new Rect (10, 100, 100, 20), mySlider, 5.0f, "Label text here");
    }
    
    float LabelSlider (Rect screenRect, float sliderValue, float sliderMaxValue, string labelText) {
        GUI.Label (screenRect, labelText);
    
        // <- Push the Slider to the end of the Label
        screenRect.x += screenRect.width; 
    
        sliderValue = GUI.HorizontalSlider (screenRect, sliderValue, 0.0f, sliderMaxValue);
        return sliderValue;
    }

}

В этом примере вызов LabelSlider() и передача правильных аргументов приведет к созданию Метки, сопряженной с Горизонтальным Слайдером. При написании Композитных Управляющих Вы должны помнить возвращать правильное значение в конце функции, чтобы сделать ее интерактивной.

Вышеуказанный Композитный Управляющий всегда создает эту пару Управляющих
Вышеуказанный Композитный Управляющий всегда создает эту пару Управляющих

Статическое управление соединениями

Используя статические функции и, вы можете создать целую коллекцию собственных Композитных Управляющих, которые являются самодостаточными. Таким образом, вам не нужно объявлять свою функцию в том же скрипте, в котором вы хотите ее использовать.

// This script is called CompoundControls
using UnityEngine;
using System.Collections;

public class CompoundControls : MonoBehaviour {     
    
    public static float LabelSlider (Rect screenRect, float sliderValue, float sliderMaxValue, string labelText) {
        GUI.Label (screenRect, labelText);
    
        // <- Push the Slider to the end of the Label
        screenRect.x += screenRect.width; 
    
        sliderValue = GUI.HorizontalSlider (screenRect, sliderValue, 0.0f, sliderMaxValue);
        return sliderValue;
    }

}

Сохранив вышеприведённый пример в скрипт под названием CompoundControls, вы можете вызвать функцию LabelSlider() из любого другого скрипта, просто введя CompoundControls.LabelSlider() и предоставив ваши аргументы.

Разработанные сочетания контроля

Вы можете быть очень креативными с Композитными Управляющими. Они могут быть расположены и сгруппированы в любом порядке, который вам нравится. Следующий пример создает многоразовый RGB Slider.

// RGB Slider Compound Control

using UnityEngine;
using System.Collections;

public class GUITest : MonoBehaviour {
        
    public Color myColor;
    
    void OnGUI () {
        myColor = RGBSlider (new Rect (10,10,200,10), myColor);
    }
    
    Color RGBSlider (Rect screenRect, Color rgb) {
        rgb.r = GUI.HorizontalSlider (screenRect, rgb.r, 0.0f, 1.0f);
    
        // <- Move the next control down a bit to avoid overlapping
        screenRect.y += 20; 
        rgb.g = GUI.HorizontalSlider (screenRect, rgb.g, 0.0f, 1.0f);
    
        // <- Move the next control down a bit to avoid overlapping
        screenRect.y += 20; 
    
        rgb.b = GUI.HorizontalSlider (screenRect, rgb.b, 0.0f, 1.0f);
        return rgb;
    }
}
Слайдер RGB, созданный в примере выше
Слайдер RGB, созданный в примере выше

Теперь давайте построим Композитные Управляющие друг над другом, чтобы продемонстрировать, как Композитные Управляющие могут быть использованы внутри других Композитных Управляющих. Для этого мы создадим новый Слайдер RGB, как показано выше, но мы будем использовать LabelSlider для этого. Таким образом, у нас всегда будет Метка, которая скажет нам, какой слайдер соответствует какому цвету.

// RGB Label Slider Compound Control

using UnityEngine;
using System.Collections;

public class GUITest : MonoBehaviour {
        
    public Color myColor;
    
    void OnGUI () {
        myColor = RGBSlider (new Rect (10,10,200,30), myColor);
    }
    
    Color RGBSlider (Rect screenRect, Color rgb) {
        rgb.r = CompoundControls.LabelSlider (screenRect, rgb.r, 1.0f, "Red");
    
        // <- Move the next control down a bit to avoid overlapping
        screenRect.y += 20; 
        rgb.g = CompoundControls.LabelSlider (screenRect, rgb.g, 1.0f, "Green");
    
        // <- Move the next control down a bit to avoid overlapping
        screenRect.y += 20; 
    
        rgb.b = CompoundControls.LabelSlider (screenRect, rgb.b, 1.0f, "Blue");
        
        return rgb;
    }   
    
}
Составной RGB Label Slider, созданный вышеуказанным кодом
Составной RGB Label Slider, созданный вышеуказанным кодом