Многие плагины iOS или Android используют функции обратного вызова которые запускаются в главном потоке iOS или Android, но не в главном потоке Unity. Так как любые изменения UI (изменение цвета, позиции объектов, размеров, текстов и т.д.) разрешены только в главном потоке, нельзя выполнять их из функций обратного вызова напрямую.

Например невозможно получить уведомления о каких-либо событиях в главном потоке Unity в тот момент, когда отображается любая полноэкранная реклама. Все потому, что Unity останавливает основной поток в тот момент, когда сцену что-либо перекрывает. Поэтому ваш скрипт работающий в основном потоке Unity получит уведомления о некоторых событиях (например onInterstitialShown или onRewardedVideoFinished) только после закрытия рекламы. Либо, как показывает практика, может не получить их вовсе.

Как же правильно обработать такие события?

Возможно наиболее комфортный способ – UnityMainThreadDispatcher.

Установка

Не требуется никаких зависимостей, кроме Unity. Этот скрипт был создан в Unity 5.3 и протестирован создателями в 5.3, 5.4 и 5.5, но используется во многих других версиях.

  1. Загрузите скрипт UnityMainThreadDispatcher.cs и добавьте его к объекту на сцене
  2. Теперь вы можете отправлять объекты в основной поток в 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"));

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *