«Игнор» лишь говорит движку: «не выбирай меня как цель (не останавливай клики на мне), когда рассчитываешь, на что именно нажали» ``` PickingMode.Ignore ``` ### То есть можно поставить picking mode на ignore и все равно подписываться на события, и эти события будут срабатывать, ловиться, даже если picking mode стоит на ignore, я правильно понимаю? Да, верно — `PickingMode.Ignore` _только_ убирает элемент из **выбора цели** (hit-test), но **не исключает его из цепочки распространения события**. ### Как это устроено 1. **Определяется `target`.** Для мыши/тача движок ищет самый верхний «пикабельный» (`PickingMode.Position`) элемент под курсором. Если элемент помечен `Ignore`, его пропускают. ([docs.unity3d.com](https://docs.unity3d.com/2020.1/Documentation/Manual/UIE-Events-Dispatching.html "Unity - Manual: Dispatching Events")) 2. **Строится путь распространения**: `root → … → parent_of_target → target → parent_of_target → … → root`. В этом списке присутствуют **все предки**, даже если для них стоит `Ignore`. ([docs.unity3d.com](https://docs.unity3d.com/2020.1/Documentation/Manual/UIE-Events-Dispatching.html "Unity - Manual: Dispatching Events")) 3. **Фаза Trickle-Down** идёт сверху вниз по этому пути (root → target). Ваш обработчик, зарегистрированный с `TrickleDown.TrickleDown`, срабатывает, потому что элемент всё равно есть в списке. > Таким образом, `panel.visualTree` (корень) получает `PointerUpEvent` в Trickle-Down-фазе, даже когда: > > - он помечен `pickingMode = Ignore`; > > - целевой элемент был уничтожен до отпускания пальца. > ### Демонстрация ```csharp var root = uiDocument.panel.visualTree; root.pickingMode = PickingMode.Ignore; // корень «невидим» для hit-test root.RegisterCallback<PointerUpEvent>(e => { Debug.Log(quot;Root got PointerUp (id={e.pointerId}) " + quot;target={e.target.name}"); }, TrickleDown.TrickleDown); ``` _Зажмите кнопку, удалите её из иерархии, затем отпустите палец — сообщение появится, подтверждая, что событие дошло до корня._ --- ### Когда события **не** дойдут - Если зарегистрировать колбэк **без** указания фазы (по умолчанию bubbling), а кто-то ниже по дереву вызвал `evt.StopImmediatePropagation()`. Поэтому мы подписываемся именно на **Trickle-Down**. --- Итого: можно смело оставлять `PickingMode.Ignore` для корня, чтобы он не перехватывал клики при выборе цели, и одновременно использовать его как «ловушку» для нужных событий — они всё равно дойдут в фазе захвата.