Асинхронная загрузка профиля падает, когда игрок выходит со сцены
Экран профиля грузит данные с сервера:
public class ProfileScreen : MonoBehaviour
{
[SerializeField] private TMP_Text nameLabel;
private async void Start()
{
var data = await _api.LoadProfileAsync();
nameLabel.text = data.Name;
}
}
Если игрок закрывает экран и уходит в бой, пока запрос ещё идёт, в лог прилетает обращение к уничтоженному объекту. Что здесь по сути не так?
- Обращаться к интерфейсу после await запрещено: продолжение метода выполняется в фоновом потоке, а объекты интерфейса доступны только из главного потока
- Задача не связана с жизнью объекта: она доживёт до конца после Destroy и обратится к уничтоженному компоненту — нужен токен отмены
- Достаточно обернуть await в try/catch: исключение перестанет попадать в лог, и проблема будет решена
- Unity прерывает все асинхронные методы при выгрузке сцены, значит причина в самом запросе: сервер отвечает после смены сцены и ломает разбор ответа
