Анализатор обнаружил использование свойства, метода или конструктора после вызова Awaitable.BackgroundThreadAsync
, которое при выполнении в фоновом потоке может привести к таким проблемам, как зависание или выброс исключения. Согласно документации Unity, все API, взаимодействующие с движком, должны использоваться строго из главного потока.
Рассмотрим пример:
private async Awaitable LoadSceneAndDoHeavyComputation() { await Awaitable.BackgroundThreadAsync(); await SceneManager.LoadSceneAsync("MainScene"); .... } public async Awaitable Update() { if (....) await LoadSceneAndDoHeavyComputation(); .... }
При выполнении метода LoadSceneAndDoHeavyComputation
вызывается метод Awaitable.BackgroundThreadAsync
, который переносит выполнение последующего кода в рамках того же метода в фоновый поток. Из-за этого проблемы могут возникнуть при последующем вызове метода SceneManager.LoadSceneAsync
.
Избежать этого можно, вернувшись в главный поток с помощью метода Awaitable.MainThreadAsync
перед вызовом SceneManager.LoadSceneAsync
:
private async Awaitable LoadSceneAndDoHeavyComputation() { await Awaitable.BackgroundThreadAsync(); .... await Awaitable.MainThreadAsync(); await SceneManager.LoadSceneAsync("MainScene"); }
Или выполнив SceneManager.LoadSceneAsync
перед переходом в фоновый поток:
private async Awaitable LoadSceneAndDoHeavyComputation() { await SceneManager.LoadSceneAsync("MainScene"); await Awaitable.BackgroundThreadAsync(); .... }
Данная диагностика классифицируется как: