Анализатор обнаружил использование свойства, метода или конструктора после вызова 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();
....
}
Данная диагностика классифицируется как: