@Ezekiel4
Охотник на пиратов и сборщик монолитов

Как запустить код в другом потоке?

Unity устроена таким образом, что метод Instantiate можно вызвать только из главного потока. В текущем проекте есть вебсокеты, которые принимают события в собственном, определённым внутри библиотеки потоке. Код получает некое событие и должен запустить метод Instantiate, но доходя до этой строки выполнение прерывается.
Суть самой задачи в том, чтобы отобразить список комнат в лобби. Из класса с вебсокетом мне приходит список игр в виде массива структур, описывающих данные открытых игр, а в классе, управляющим окном лобби мне нужно вызвать метод Instantiate. Как это сделать?

Я вижу 4 способа:
1) Объявить volatile переменную в классе лобби и отображать её состояние, а из класса с сокетом обновлять его - не работает.
2) Вызвать из класса с вебсокетом публичный метод, запускающий корутину или Invoke - тоже не работает.
3) Jobs - оставил на крайний случай, т.к. знаком лишь с описанием библиотеки, а времени слишком мало.
4) Ничего не создавать через Instantiate. Иметь пул уже созданных сущностей, а лишь манипулировать ими, отображая нужное их количество и обновляя их состояния - скорее всего, так и сделаю, если не найду более подходящего способа, благо в тз так и написано, что в списке должно быть до 100 игр.

UPD. Чтобы проверить, возможно ли вообще 4 сделать, я пробовал управлять свойством parent и методом SetActive(), но они тоже не запускаются, поэтому 4 способ тоже не получится.
  • Вопрос задан
  • 167 просмотров
Решения вопроса 1
@Ezekiel4 Автор вопроса
Охотник на пиратов и сборщик монолитов
Мб кому пригодится, мне помогло решение:

// ...
using System.Collections.Concurrent;
// ...
private readonly ConcurrentQueue<Action> _Actions = new ConcurrentQueue<Action>();
// ...
// Когда вам нужно что-то запустить из другого потока, вызываете тут
_Actions.Enqueue(() => {
	// Ваш код
});
// ...
private void Update() {
	while (_Actions.Count > 0)
		if (_Actions.TryDequeue(out var action))
			action?.Invoke();
// ...
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы