Ada sejumlah cara untuk memanfaatkan dan memperluas sistem IMGUI untuk memenuhi kebutuhan Anda. Kontrol dapat dicampur dan dibuat, dan Anda memiliki banyak leverage dalam menentukan bagaimana input pengguna ke GUI diproses.
Mungkin ada situasi di GUI Anda di mana dua jenis kontrol selalu muncul bersama. Misalnya, mungkin Anda membuat layar Penciptaan Karakter, dengan beberapa Slider Horizontal. Semua Slider tersebut membutuhkan Label untuk mengidentifikasi mereka, sehingga pemain tahu apa yang mereka sediakan. Dalam kasus ini, Anda dapat bermitra setiap panggilan ke GUI.Label() dengan panggilan ke GUI.HorizontalSlider(), atau Anda dapat membuat Compound Control yang mencakup kedua Label dan Slider bersama.
/* Label and Slider Compound Control */
// JavaScript
var mySlider : float = 1.0;
function OnGUI () {
mySlider = LabelSlider (Rect (10, 100, 100, 20), mySlider, 5.0, "Label text here");
}
function LabelSlider (screenRect : Rect, sliderValue : float, sliderMaxValue : float, labelText : String) : float {
GUI.Label (screenRect, labelText);
screenRect.x += screenRect.width; // <- Push the Slider to the end of the Label
sliderValue = GUI.HorizontalSlider (screenRect, sliderValue, 0.0, sliderMaxValue);
return sliderValue;
}
// C#
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;
}
}
Dalam contoh ini, memanggil LabelSlider() dan melewati argumen yang benar akan memberikan Label dipasangkan dengan Slider Horizontal. Ketika menulis Kontrol Senyawa, Anda harus ingat untuk mengembalikan nilai yang benar pada akhir fungsi untuk membuatnya interaktif.
Dengan menggunakan fungsi Static, Anda dapat membuat seluruh koleksi Kendali Senyawa Anda sendiri yang mandiri. Cara ini, Anda tidak harus menyatakan fungsi Anda dalam skrip yang sama yang ingin Anda gunakan.
/* This script is called CompoundControls */
// JavaScript
static function LabelSlider (screenRect : Rect, sliderValue : float, sliderMaxValue : float, labelText : String) : float {
GUI.Label (screenRect, labelText);
screenRect.x += screenRect.width; // <- Push the Slider to the end of the Label
sliderValue = GUI.HorizontalSlider (screenRect, sliderValue, 0.0, sliderMaxValue);
return sliderValue;
}
// C#
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;
}
}
Dengan menyimpan contoh di atas dalam skrip yang disebut CompoundControls, Anda dapat memanggil fungsi LabelSlider() dari skrip lain hanya mengetik CompoundControls.LabelSlider() dan memberikan argumen Anda.
Anda bisa mendapatkan sangat kreatif dengan Kontrol Senyawa. Mereka dapat diatur dan dikelompokkan dengan cara apa pun yang Anda sukai. Contoh berikut menciptakan RGB Slider yang dapat digunakan kembali.
/* RGB Slider Compound Control */
// JavaScript
var myColor : Color;
function OnGUI () {
myColor = RGBSlider (Rect (10,10,200,10), myColor);
}
function RGBSlider (screenRect : Rect, rgb : Color) : Color {
rgb.r = GUI.HorizontalSlider (screenRect, rgb.r, 0.0, 1.0);
screenRect.y += 20; // <- Move the next control down a bit to avoid overlapping
rgb.g = GUI.HorizontalSlider (screenRect, rgb.g, 0.0, 1.0);
screenRect.y += 20; // <- Move the next control down a bit to avoid overlapping
rgb.b = GUI.HorizontalSlider (screenRect, rgb.b, 0.0, 1.0);
return rgb;
}
// C#
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;
}
}
Sekarang mari kita membangun Kontrol Senyawa di atas satu sama lain, untuk menunjukkan bagaimana Kontrol Senyawa dapat digunakan dalam Kontrol Senyawa lainnya. Untuk melakukan ini, kami akan membuat RGB Slider baru seperti yang di atas, tetapi kami akan menggunakan LabelSlider untuk melakukannya. Cara ini kita akan selalu memiliki Label memberitahu kami yang slider sesuai dengan warna mana.
/* RGB Label Slider Compound Control */
// JavaScript
var myColor : Color;
function OnGUI () {
myColor = RGBLabelSlider (Rect (10,10,200,20), myColor);
}
function RGBLabelSlider (screenRect : Rect, rgb : Color) : Color {
rgb.r = CompoundControls.LabelSlider (screenRect, rgb.r, 1.0, "Red");
screenRect.y += 20; // <- Move the next control down a bit to avoid overlapping
rgb.g = CompoundControls.LabelSlider (screenRect, rgb.g, 1.0, "Green");
screenRect.y += 20; // <- Move the next control down a bit to avoid overlapping
rgb.b = CompoundControls.LabelSlider (screenRect, rgb.b, 1.0, "Blue");
return rgb;
}
// C#
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;
}
}