В дополнение к ответам, фиксирующим ваш сопрограмм:
Сопрограммы на самом деле не многопоточны! Вот почему ваше приложение зависает, если в сопрограмме есть длинная задача.
* * * * yield return
сопрограмм просто делает / ленивым сделать быструю анимацию или что-то подобное, потому что сопрограммы вроде "запоминают", куда они ушли, и переходят с этого момента (говоря простыми словами), так что вы может запустить много вещей, видимо, "параллельно". Но, тем не менее, все это выполняется в одном и том же потоке, поэтому на самом деле кажется, что оно выполняется только параллельно, потому что все выполняется между двумя кадрами.
Если у вас действительно есть трудоемкая задача, которую вы хотите выполнить в другом потоке, чем загляните в async await , которая является реальной многопоточностью Unity начиная с Unity 2017.
Однако Unity - , а не , сохранение потока означает, что большая часть API может использоваться только в основном потоке ...