コントロールとは、ボタン、ラベル、チェックボックスなどのグラフィカルユーザーインターフェースの要素のことです。コントロールのビジュアルと、コントロールのインタラクションを操作するためのスクリプト化されたロジックが含まれます。
UI Toolkit のコントロールは プレハブ のようなもので、ビジュアル要素とスクリプトを組み合わせて UI パネルで使用できるテンプレートにします。
コントロールは、単一のビジュアル要素で構成される場合と、複数のビジュアル要素の組み合わせで構成される場合があります。
例えば、上図の Toggle
コントロールには、3 つの要素が含まれています。
Toggle
コントロールの実装では、コントロールの動作を定義します。トグルの状態が true か false かの内部値を持っています。このロジックは、値が変化するときに、チェックマーク画像の可視性を変化させます。
UI でコントロールを使用するには、ビジュアルツリー と呼ばれる UI 階層にコントロールを加える必要があります。コントロールの追加は、スクリプト、UXML、または UI Builder で行うことができます。
以下のコードスニペットは、既存のビジュアルツリーに Button
コントロールを追加する方法を示しています。
var newButton = new Button("Click me!");
rootVisualElement.Add(newButton)。
UI 階層にコントロールを加える場合、レイアウトエンジンが自動的にサイズ調整と位置調整を行います。自動レイアウトの詳細については、レイアウトエンジン を参照してください。
ビジュアル要素のサイズや位置を手動で上書きすることもできます。位置を手動で制御する方法については、ビジュアルツリー のページを参照してください。
UI Toolkit のすべてのビジュアル要素は、スタイルを使用してその属性を定義します。スタイルのプロパティを変更するには、次の 3 つの方法があります。
コントロールはインタラクティブで、変更可能な値を表します。例えば、FloatField
は float 値を表しています。コードを使って、変化に反応することができます。以下はその例です。
コントロールが変更可能な値を表す場合、それは value
プロパティを含んでいます。スクリプトは value
プロパティを使用して、コントロールの値に直接アクセスできます。以下のコードスニペットでは、Toggle
コントロールと Button
コントロールを作成します。ボタンをクリックすると、トグルの値が反転します。
// トグルを作成してコールバックを登録
m_MyToggle = new Toggle("Test Toggle") { name = "My Toggle" };
rootVisualElement.Add(m_MyToggle);
// トグルの値を反転するボタンを作成
Button button01 = new Button() { text = "Toggle" };
button01.clicked += () =>
{
m_MyToggle.value = !m_MyToggle.value;
};
rootVisualElement.Add(button01);
特定のコントロールのプロパティの詳細は、UI Toolkit コントロールリファレンス を参照してください。
value
プロパティを持つすべてのビルトインコントロールは、値が変更されるとイベントを送信します。コードでは、このイベントを受け取るコールバックを登録することができます。次のコードスニペットは、 Toggle
コントロールを作成し、コールバックを登録する方法を示しています。
// トグルを作成してコールバックを登録
m_MyToggle = new Toggle("Test Toggle") { name = "My Toggle" };
m_MyToggle.RegisterValueChangedCallback((evt) => { Debug.Log("Change Event received"); });
rootVisualElement.Add(m_MyToggle);
コールバックとイベントの詳細は、イベントの処理 を参照してください。
コントロールは、オブジェクトやシリアル化されたプロパティに直接紐づける (バインディング) ことができます。例えば、 FloatField
コントロールは、MonoBehaviour
に属する public float 変数に紐づけできます。コントロールがプロパティに紐づけられると、自動的にそのプロパティの値を表示します。ユーザーがコントロールを変更すると、プロパティの値が更新されます。
同様に、コードによってプロパティの値を変更すると、UI には更新された値が表示されます。この双方向のつながりは、カスタムのインスペクターを作成する場合に便利です。
データバインディングの詳細は、バインディング のページを参照してください。
すべてのコントロールがバインド可能というわけではありません。すべてのビルトインコントロールの一覧と、バインディングをサポートしているかどうかについては、UI Toolkit controls reference を参照してください。
UI Toolkit では、カスタムのコントロールを作成することができます。これにより、複雑なコントロールを作成したり、ユーザーインターフェース要素にカスタムロジックを実装したりすることができます。
コントロールは、VisualElement
または VisualElement
のサブクラス (例えば TextElement
) から直接派生します。また、コントロールの動作を実装するためにマニピュレーターを加えることもあります。例えば、Button
コントロールは Clickable
マニピュレーターを加えます。
Unity には、ラベル、テキストフィールド、トグルなどの標準的なコントロールが数多く用意されています。一部のコントロールは、エディターでのみ使用できます。 UI Toolkit の内蔵コントロールの完全なリストについては、UI Toolkit コントロールリファレンス を参照してください。
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.