Какие части Unity API доступны не из главного потока?
Что проверяют
Знаете ли вы, что почти весь UnityEngine привязан к главному потоку, и умеете ли выносить тяжёлую работу так, чтобы не ловить исключения. Следом обычно просят объяснить, как вернуть результат из фона обратно на главный поток.
Как отвечать
Правило по умолчанию: всё, что трогает объекты движка, живёт на главном потоке. GameObject, Transform, компоненты, Instantiate, Resources.Load, PlayerPrefs, Application.persistentDataPath из другого потока бросят UnityException с текстом «can only be called from the main thread».
Что можно вне главного потока:
- математика:
Vector3,Quaternion,Matrix4x4,Mathfэто обычные структуры и функции. Для случайных чисел беритеSystem.RandomилиUnity.Mathematics.Random, потому чтоUnityEngine.Randomработает только на главном потоке; Debug.Log: можно звать из любого потока;- Job System:
IJobиIJobParallelForработают сNativeArrayи другими нативными контейнерами, а safety system ловит гонки. Burst это компилятор, ускоряющий такие задачи, а не отдельное API; - данные движка внутри задач:
TransformAccessArrayсIJobParallelForTransform,Mesh.MeshData, пакетныеRaycastCommand; - чистый C#: парсинг, сжатие, файлы через
System.IO, если путь получен заранее на главном потоке.
Отдельно про async/await: сам по себе он поток не меняет. Unity ставит свой SynchronizationContext, и продолжение после await возвращается на главный поток. В фон уводит Task.Run, а в Unity 6 есть Awaitable.BackgroundThreadAsync() и Awaitable.MainThreadAsync() для явного переключения туда и обратно.
Где спотыкаются
Считают async/await многопоточностью и удивляются, что тяжёлый расчёт после await всё равно подвешивает кадр.
Трогают transform.position прямо из Task.Run и получают исключение. Результат нужно вернуть на главный поток: через Awaitable.MainThreadAsync(), очередь, которую разбирает Update, или сохранённый SynchronizationContext.
Забывают Complete() у JobHandle перед чтением результата и Dispose() у NativeArray. Итог: ошибки safety system и утечки нативной памяти.