Многие плагины iOS или Android используют функции обратного вызова которые запускаются в главном потоке iOS или Android, но не в главном потоке Unity. Так как любые изменения UI (изменение цвета, позиции объектов, размеров, текстов и т.д.) разрешены только в главном потоке, нельзя выполнять их из функций обратного вызова напрямую.
Например невозможно получить уведомления о каких-либо событиях в главном потоке Unity в тот момент, когда отображается любая полноэкранная реклама. Все потому, что Unity останавливает основной поток в тот момент, когда сцену что-либо перекрывает. Поэтому ваш скрипт работающий в основном потоке Unity получит уведомления о некоторых событиях (например onInterstitialShown
или onRewardedVideoFinished
) только после закрытия рекламы. Либо, как показывает практика, может не получить их вовсе.
Как же правильно обработать такие события?
Возможно наиболее комфортный способ – UnityMainThreadDispatcher.
Установка
Не требуется никаких зависимостей, кроме Unity. Этот скрипт был создан в Unity 5.3 и протестирован создателями в 5.3, 5.4 и 5.5, но используется во многих других версиях.
- Загрузите скрипт UnityMainThreadDispatcher.cs и добавьте его к объекту на сцене
- Теперь вы можете отправлять объекты в основной поток в Unity.
Использование
public IEnumerator ThisWillBeExecutedOnTheMainThread() {
Debug.Log ("This is executed from the main thread");
yield return null;
}
public void ExampleMainThreadCall() {
UnityMainThreadDispatcher.Instance().Enqueue(ThisWillBeExecutedOnTheMainThread());
}
или
UnityMainThreadDispatcher.Instance().Enqueue(() => Debug.Log ("This is executed from the main thread"));