パネルは、UI 階層の可視インスタンスを表します。パネルは、ビジュアルツリーの階層の中で、要素の動作イベントのディスパッチを処理します。階層のルートのビジュアル要素への参照を維持します。ランタイム UIでは、UGUI の Canvas に相当します。
パネルがレンダリングやイベントを受け取るためには、ビジュアル要素のインスタンスをパネルにアタッチする必要があります。
パネルイベントは、パネルとの関係が変化するときにビジュアル要素で発生します。例えば、ビジュアル要素をパネルに加えるとき (AttachToPanelEvent
)、またはパネルから削除するとき (DetachFromPanelEvent
) などです。
パネルイベントは、パネルの変更の発生時に直接影響を受ける階層内のビジュアル要素とその子孫にのみ送信されます。親要素は、子孫のビジュアル要素がパネルに接続されたり離されたりしてもイベントを受け取りません。
例えば、以下の UXML コードでは、既にパネルに接続している階層に parent
ビジュアル要素を加えると、 parent
、child
、grandchild
のすべてが同じイベントを受け取ります。同じ UXML 階層から parent
を削除すると、すべてのビジュアル要素が DetachFromPanel
イベントを受け取ります。
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements">
<ui:VisualElement name="parent">
<ui:VisualElement name="child">
<ui:VisualElement name="grandchild" />
</ui:VisualElement>
</ui:VisualElement>
</ui:UXML>
すべてのパネルイベントの基本クラスは、PanelChangedEventBase です。
イベント | 説明 | 下降伝播 | 上昇伝播 | キャンセル可能 |
---|---|---|---|---|
AttachToPanelEvent | 要素 (またはその親) がパネルに接続された直後に送信されます。 | |||
DetachFromPanelEvent | 要素 (またはその親) がパネルから離される直前に送信されます。 |
originPanel
: originPanel
には、DetachFromPanelEvent
特有のデータが含まれています。パネル変更時にビジュアル要素が切り離されるソースパネルが示されています。
destinationPanel
: destinationPanel
には、AttachFromPanelEvent
特有のデータが含まれています。データは、ビジュアル要素が現在接続しているパネルを示します。
以下のリストは、イベントファミリーの各イベントの名前、説明、ターゲットを示しています。
AttachToPanelEvent
は、ビジュアル要素がパネルにアタッチされた後に発生します。また、パネルに接続されている階層にビジュアル要素を加える場合にも発生します。
target
: パネルに接続しているビジュアル要素。
DetachFromPanelEvent
は、パネルからビジュアル要素を取り除く前に送信されます。また、パネルに接続している階層からビジュアル要素を取り除く際にも発生します。
target
: パネルから切り離されるビジュアル要素。
以下の例では、ウィンドウにラベルを追加するボタンを備えたエディターウィンドウを作成します。ラベルをクリックすると、それらは削除されます。
この例ではカスタムラベルクラスを実装し、VisualElement のインスタンスをパネルに接続したり、パネルから切り離したりすると、コンソールにメッセージを表示します。この例では、AttachToPanelEvent と DetachFromPanelEvent イベントの動作、および originPanel と destinationPanel プロパティの使用方法を紹介します。
この例を実際に行うには、以下を行います。
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
public class PanelEventsTestWindow : EditorWindow
{
[MenuItem("Window/UI Toolkit/Panel Events Test Window")]
public static void ShowExample()
{
PanelEventsTestWindow wnd = GetWindow<PanelEventsTestWindow>();
wnd.titleContent = new GUIContent("Panel Events Test Window");
}
public void CreateGUI()
{
// パネルの名前を設定
rootVisualElement.panel.visualTree.name = "Our Window Root Visual Element";
// カスタムラベルの新しいインスタンスをウィンドウに加えるボタンを加えます
rootVisualElement.Add(new Button(() => rootVisualElement.Add(new CustomLabel())) { text = "Add New Label" });
}
}
/// <summary>
/// 接続またはデタッチ時にコンソールメッセージを出力するカスタムラベルクラス
/// </summary>
public class CustomLabel : Label
{
private static int m_InstanceCounter = 0;
private int m_LabelNumber;
public CustomLabel() : base()
{
m_LabelNumber = ++m_InstanceCounter;
text = $"Label #{m_LabelNumber} - click me to detach";
RegisterCallback<AttachToPanelEvent>(evt =>
{
Debug.Log($"I am label {m_LabelNumber} and I " +
$"just got attached to panel '{evt.destinationPanel.visualTree.name}'");
});
RegisterCallback<DetachFromPanelEvent>(evt =>
{
Debug.Log($"I am label {m_LabelNumber} and I " +
$"just got detached from panel '{evt.originPanel.visualTree.name}'");
});
// この要素を階層から削除するポインターダウンコールバックを登録します
RegisterCallback<PointerDownEvent>(evt => this.RemoveFromHierarchy());
}
}
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.