``> Данный способ не работает. Рабочий способ смотрите [[Как выполнить действия без провоцирования событий (Unity Callback Events)|здесь]]. Да, в Unity можно различить, было ли выделение объекта на сцене сделано программно или через интерфейс редактора, но это потребует некоторого обходного решения. Сам по себе класс `Selection` не предоставляет прямого способа отличить, каким образом произошло выделение (программно или через интерфейс). Однако, можно реализовать логику, которая будет отслеживать, когда объект выделяется программно, и игнорировать такие случаи в вашем обработчике события. ### Подход: 1. **Флаг для программного выделения**: Использовать флаг, который будет активироваться перед программным выделением, и сбрасываться сразу после. Если этот флаг активен в момент вызова обработчика события `Selection.selectionChanged`, то это означает, что выделение было сделано программно, и его можно проигнорировать. ### Пример реализации: ```csharp using UnityEditor; using UnityEngine; public class SelectionTracker : MonoBehaviour { private static bool isProgrammaticSelection = false; // Подписка на событие изменения выделения [InitializeOnLoadMethod] static void Initialize() { Selection.selectionChanged += OnSelectionChanged; } // Метод для программного выделения public static void SelectObjectProgrammatically(GameObject obj) { isProgrammaticSelection = true; Selection.activeObject = obj; isProgrammaticSelection = false; } // Обработчик события SelectionChanged static void OnSelectionChanged() { if (isProgrammaticSelection) { // Программное выделение - игнорируем return; } // Обработка обычного (интерфейсного) выделения Debug.Log("Объект был выделен через интерфейс редактора"); } } ``` ### Как это работает: 1. **Флаг `isProgrammaticSelection`**: - Этот флаг устанавливается в `true` перед тем, как вы программно выделяете объект, и возвращается в `false` сразу после этого. - В обработчике события `OnSelectionChanged` проверяется значение флага. Если флаг установлен, значит, выделение было сделано программно, и событие игнорируется. 2. **Программное выделение**: - Используйте метод `SelectObjectProgrammatically`, чтобы программно выделять объекты без срабатывания вашей логики для интерфейсного выделения. 3. **Отслеживание интерфейсного выделения**: - Если выделение сделано пользователем через интерфейс, флаг будет установлен в `false`, и тогда в логах появится сообщение о выделении через интерфейс. ### Итог: Этот подход позволяет отслеживать выделения, сделанные через интерфейс редактора Unity, и игнорировать программные выделения, что решает вашу задачу.