合成並發送事件(Synthesize and send events)

事件系統使用一個事件池(pool of events),以避免重複分配事件物件(event object)。要合成並發送自己的事件需要:

  1. 建立一個UnityEngine.Event用來持有初始化的資料
  2. 從事件池中獲取一個事件物件。
  3. 填寫事件的屬性(event properties)。
  4. 將事件封裝在using區塊中,以確保它被返回到事件池。
  5. 將事件傳遞給panel.visualTree.SendEvent()

下面的例子中會發送一個KeyDownEvent

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void SynthesizeAndSendKeyDownEvent(IPanel panel, KeyCode code,
char character = '\0', EventModifiers modifiers = EventModifiers.None)
{
// 建立一個UnityEngine.Event用來持有初始化的資料
var evt = new Event() {
type = EventType.KeyDownEvent,
keyCode = code,
character = character,
modifiers = modifiers
};

// 將事件封裝在`using`區塊中,以確保它被返回到事件池
using (KeyDownEvent keyDownEvent = KeyDownEvent.GetPooled(evt))
{
panel.visualTree.SendEvent(keyDownEvent);
}
}

注意:

  1. 不能發送不是來自OS(operating system)的事件,
  2. 不能發送不在UnityEngine.Event types中的事件
  3. 某些事件是由UI Toolkit作為對內部狀態變化的反應而發送的,不應由外部過程發送。例如,如果您發送PointerCaptureEvent,visual elements會假定該事件的底層條件已滿足,並且不會為它們設置指針捕獲(pointer capture)。這可能會破壞visual elements的內部配置(configurations)並導致未定義的行為。

Event reference

Reference: https://docs.unity3d.com/Manual/UIE-Events-Synthesizing.html

評論