V3214. Unity Engine. Using Unity API in the background thread may result in an error.

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

Данная диагностика классифицируется как: