Модификация UI элементов не в основном потоке Unity
В настоящее время я активно изучаю и использую Unity для разработки проекта с AR и столкнулся с классической проблемой "модификации UI элементов не в основном потоке" - так делать нельзя, поскольку средой будет вызвано исключение UnityException.
В рамках изучения этого вопроса я далеко не сразу нашёл решение. Передо мной стояла задача сделать обработку сообщения, получаемого по каналу связи через WebSocket, изменив при этом некоторые UI элементы. Обработка происходит не в основном потоке.
Через некоторое время я наткнулся на одно из возможных решений этой проблемы через очередь задач, которая решает данную проблему:
// Экземпляр WebSocket private WebSocket _ws; // Очередь команд для обработки private readonly ConcurrentQueue<Action> _actions = new ConcurrentQueue<Action>(); void Start() { // ... ConnectWebSocket(); } void ConnectWebSocket() { // ... // Добавление обработчика ответа от сервера _ws.OnMessage += OnMessage; // ... } void Update() { // ... while (_actions.Count > 0) { if (_actions.TryDequeue(out var action)) { // Выполнение задачи из очереди action?.Invoke(); } } } void OnMessage(object sender, MessageEventArgs e) { // Добавление команды в очередь _actions.Enqueue(() => MessageHandler(sender, e)); } void MessageHandler(object sender, MessageEventArgs e) { // Данный блок кода выполняется в основном (main) потоке }
