Version: Unity 6.0 (6000.0)
言語 : 日本語
要素のフォーカス順
マニピュレーター

カスタムコントロールによるイベントへの応答

カスタムコントロールを実装している場合は、UI Toolkit のイベントに以下の方法で応答することができます。

イベントに対してどのように応答するかは、状況によって異なります。コールバックと仮想メソッドのオーバーライドの違いを以下に示します。

  • コールバックはクラスのインスタンスに登録する必要があります。仮想メソッドはクラス自体を変更する必要があります。
  • 仮想メソッドのオーバーライドは伝播段階でコールバックレジストリの検索を必要としないため、パフォーマンス面で若干有利です。

HandleEventBubbleUp または HandleEventTrickleDown 仮想メソッドのオーバーライド

仮想メソッドのオーバーライドはクラスのすべてのインスタンスに適用されます。HandleEventBubbleUp または HandleEventTrickleDown をオーバーライドするクラスの場合は、対象のインスタンスにコールバックを登録することもできます。

HandleEventBubbleUp または HandleEventTrickleDown メソッド、あるいはそれらの両方をオーバーライドするには、VisualElement の新しいサブクラスを派生させます。

HandleEventBubbleUpHandleEventTrickleDown は、ビジュアル要素のサブクラスのインスタンスがイベントを受け取ったときに、各インスタンスで実行されます。

以下の例は、これらの仮想メソッドをカスタマイズする方法を示しています。

override void HandleEventBubbleUp(EventBase evt)
{
    // Call the base function.
    base.HandleEventBubbleUp(evt);

    if (evt.eventTypeId == PointerDownEvent.TypeId())
    {
        // ...
    }
    else if (evt.eventTypeId == MouseUpEvent.TypeId())
    {
        // ...
    }
    // More event types
}

特定のクラスのスタンスについて、以下の場合にカスタムコードを実行しても同じ結果になります。

  • BubbleUp フェーズに設定されたコールバック
  • HandleEventBubbleUp メソッドのオーバーライド

いずれの場合も、イベントの伝播を停止すると、現在のターゲットのコールバックとメソッドのオーバーライドを実行した後のイベントへの反応が阻止されます。

推奨ガイド

以下に示すのは、カスタムコントロールでイベントを処理するためのベストプラクティスです。

動作の実装

一般的に、要素から動作を実装するには、HandleEventBubbleUp メソッドのオーバーライドを使用します。

BubbleUp はコールバックのデフォルトの伝播段階であるため、コード実行のタイミングを変更することを必要とせず、任意のコードをコールバックから HandleEventBubbleUp メソッドに移動できます。

動作をメソッドオーバーライドとして実装することの利点には、次のものがあります。

  • デフォルトアクションが、コールバックレジストリのルックアップを必要としません。
  • コールバックのないインスタンスは伝搬プロセスに入りません。

イベント伝播の停止

コールバックまたは仮想メソッドのオーバーライド内のイベントを処理する場合は、イベントで StopPropagation メソッドの 1 つを呼び出すことで、以降のイベント伝播を停止できます。例えば、親パネルは降下段階で伝搬を停止し、子パネルがイベントを受け取らないようにすることができます。

イベントクラス自体の内部では、EventBase.PreDispatch() メソッドと EventBase.PostDispatch() メソッドの実行を阻止することはできません。

以下のメソッドは、イベントの伝播に影響します。

  • StopImmediatePropagation(): イベント伝播プロセスを直ちに停止して、イベントに対する後続のコールバックの実行を阻止します。
  • StopPropagation(): 現在の要素の最後のコールバック後のイベント伝播プロセスを停止します。これにより、すべてのコールバックが現在の要素で実行され、後続の要素はイベントに応答しなくなります。

追加リソース

要素のフォーカス順
マニピュレーター