У меня есть довольно простой c блок кода, который мне нужно запустить в отдельном потоке или в асинхронном режиме c, так как он должен ждать некоторое время каждый l oop, пока он не породит все ящики из массива.
Я пробовал так много техник, которые, кажется, работают везде, но я ошеломлен своей ошибкой.
Когда я удаляю нити и асин c и запускаю для l oop без задержек, это работает, но так как нет никаких задержек, я получаю каскад летающих коробок. Это не будет делать.
Проще говоря, мне нужно подождать 'некоторое время' каждый для l oop, прежде чем создать следующий блок, чтобы позволить текущему блоку сойти с дороги. Я хочу сделать это, не блокируя основной поток. Однако, когда я использую многопоточность или asyn c, for для l oop просто никогда не выполняется.
Кто-нибудь видит что-нибудь, что указывало бы, почему оно не выполняется? Моя отладка подтверждает, что мой список ящиков при запуске не пуст, что означает, что for l oop соответствует требованиям для выполнения.
Вот мой код:
public void HandleBoxSpawnThread() {
ThreadPool.QueueUserWorkItem(ImportBoxSpawn);
}
public void ImportBoxSpawn(object state) {
Debug.Log("Spawning!");
Debug.Log("Count: "+readFromList.finalBoxList.Count);
for (int i = 0; i < readFromList.finalBoxList.Count; i++) {
geniLoc = GeniEntrance.position;
geniLoc += new Vector3(UnityEngine.Random.Range(-0.5f, 0.5f), 2, 2);
float width = readFromList.finalBoxList[i].w;
float length = readFromList.finalBoxList[i].l;
width = width/39.3701f;
length = length/39.3701f;
float height = UnityEngine.Random.Range(0.3f,0.5f)*length;//Random.Range(0.0762f, 0.762f)
Box_random.transform.localScale = new Vector3(width,height,length);
Box_random.GetComponent<Rigidbody>().mass = (length*width*height)*50;
Instantiate(Box_random, geniLoc, Quaternion.identity,myGeniParent);
Debug.Log("Spawning Box "+i+".");
Thread.Sleep(1000);
Debug.Log("End");
}
}
EDIT: После некоторых дополнительных отладок и исследований выясняется, что использование преобразований ...
geniLoc = GeniEntrance.position;
... не работает в отдельных потоках в Unity3D. Я переключился на использование сопрограммы и получил поведение, которое я хотел. Поскольку это не сложный расчет или что-то, что я ожидаю много раз, я не так обеспокоен стоимостью выполнения. В более сложных ситуациях, когда происходит много вычислений, правильным решением будет обратный вызов основного потока для управления преобразованиями из второго потока. Спасибо всем!