Страница 1 из 1

Запуск скрипта при фокусе редактора Unity

СообщениеДобавлено: 03 июл 2014, 14:28
[bm]
Как можно запустить скрипт, когда фокус на редакторе?

Re: Запуск скрипта на фокусе редактора

СообщениеДобавлено: 03 июл 2014, 14:57
BenjaminMoore
что подразумевается под «запустить скрипт»?

Re: Запуск скрипта на фокусе редактора

СообщениеДобавлено: 03 июл 2014, 15:22
Neodrop

Re: Запуск скрипта на фокусе редактора

СообщениеДобавлено: 03 июл 2014, 15:50
[bm]
Это же фокус окна внутри unity? а мне надо фокус на всю unity (Alt+Tab).

Re: Запуск скрипта на фокусе редактора

СообщениеДобавлено: 03 июл 2014, 15:59
Neodrop
Дык просто задача описана не точно. :-?
Вот тут даже не знаю, как быть. Не припомню такого механизма в Editor.
Может быть, прокатит такой вариант :
Прицепиться к EditorApplication.update и там проверять состояние флага isUpdating

По идее, когда редактор Unity потеряет фокус, этот флаг должен встать в false и переключится на true, когда фокус вернётся.

Re: Запуск скрипта на фокусе редактора

СообщениеДобавлено: 03 июл 2014, 16:02
[bm]
Во! А вот это подходит. Спасибо! Как же я так забыл про этот колбэк.

Re: Запуск скрипта на фокусе редактора

СообщениеДобавлено: 03 июл 2014, 16:03
Neodrop
Ну, тут возможны всякие подводные камни. :-?
Стоит потестировать.
Отпиши, пожалуйста, о результатах ;)

Re: Запуск скрипта на фокусе редактора

СообщениеДобавлено: 03 июл 2014, 16:37
[bm]
Уже застрял, добавил аттрибут [InitializeOnLoad] к классу, Update работает. А вот на фокус и на всякие там OnEnable, OnFocus не реагирует. Update вызывается всегда.

Re: Запуск скрипта на фокусе редактора

СообщениеДобавлено: 03 июл 2014, 16:40
Neodrop
Так покажи хотя бы код то, а то совсем не понятно, что там у тебя работает, а что нет. И вообще, чего именно ты хочешь добиться то?

Re: Запуск скрипта на фокусе редактора

СообщениеДобавлено: 03 июл 2014, 16:56
[bm]
Код простой:

Синтаксис:
Используется csharp
[InitializeOnLoad]
public static class MyStaticInitializer
{
  static MyStaticInitializer()
  {
    EditorApplication.update += Update;
  }

  void Update()
{
   Debug.Log(ApplicationIsActivated());
}

public static bool ApplicationIsActivated()
{
    var activatedHandle = GetForegroundWindow();
    if (activatedHandle == IntPtr.Zero) {
        return false;       // No window is currently activated
    }

    var procId = Process.GetCurrentProcess().Id;
    int activeProcId;
    GetWindowThreadProcessId(activatedHandle, out activeProcId);

    return activeProcId == procId;
}


[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
private static extern IntPtr GetForegroundWindow();

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern int GetWindowThreadProcessId(IntPtr handle, out int processId);

}


Работает под виндой.
А как сделать под Мак ОС? :-?