Estoy tratando de crear una instancia de un árbol prefabricado basado en transformaciones (específicamente la posición y la rotación) que se cargan desde una base de datos de firebase.
El problema aquí es que el bucle foreach solo itera una vez, aunque hay un total de 4 hijos en la instantánea. Hijos, por lo que no sé por qué solo se ejecuta una vez.
este es el metodo
public void GetTrees() { reference.Child("Player").Child(scenarioName).GetValueAsync().ContinueWith(task => { if (task.IsFaulted) { Debug.LogError("Error"); } else if (task.IsCompleted) { DataSnapshot snapshot = task.Result; foreach (DataSnapshot tree in snapshot.Children) { xPos = float.Parse(tree.Child("xPos").Value.ToString()); yPos = float.Parse(tree.Child("yPos").Value.ToString()); zPos = float.Parse(tree.Child("zPos").Value.ToString()); xRot = float.Parse(tree.Child("xRot").Value.ToString()); yRot = float.Parse(tree.Child("yRot").Value.ToString()); zRot = float.Parse(tree.Child("zRot").Value.ToString()); wRot = float.Parse(tree.Child("wRot").Value.ToString()); Vector3 loadTreePosition = new Vector3(xPos, yPos, zPos); Quaternion loadTreeRotation = new Quaternion(xRot, yRot, zRot, wRot); //returns the position of Tree 0 (31.63, .03, -38.79) Debug.Log("Tree Positons " + loadTreePosition); //returns the rotation of Tree 0 (0,0,0,1) Debug.Log("Tree Rotations " + loadTreeRotation); //returns 4 Debug.Log(snapshot.ChildrenCount); Instantiate(treePrefab, loadTreePosition, loadTreeRotation); //THIS DOES NOT RETURN ANYTHING Debug.Log(snapshot.ChildrenCount); } } }); }Aquí está la consola con las declaraciones debug.log que se muestran en la imagen de la consola de registro de depuración del método
Aquí está la información de la base de datos como json
{ "Player" : { "test" : { "Tree 0" : { "mesh" : "palm-01 Instance", "wRot" : 1, "xPos" : 31.629507064819336, "xRot" : 0, "yPos" : 0.029083967208862305, "yRot" : 0, "zPos" : -38.7875862121582, "zRot" : 0 }, "Tree 1" : { "mesh" : "palm-01 Instance", "wRot" : 1, "xPos" : 31.059694290161133, "xRot" : 0, "yPos" : 0.029083967208862305, "yRot" : 0, "zPos" : -40.921390533447266, "zRot" : 0 }, "Tree 2" : { "mesh" : "palm-01 Instance", "wRot" : 1, "xPos" : 31.059694290161133, "xRot" : 0, "yPos" : 0.029083967208862305, "yRot" : 0, "zPos" : -40.921390533447266, "zRot" : 0 }, "Tree 3" : { "mesh" : "palm-01 Instance", "wRot" : 1, "xPos" : 31.46793556213379, "xRot" : 0, "yPos" : 0.029083967208862305, "yRot" : 0, "zPos" : -43.42497253417969, "zRot" : 0 } } } }Método más probable Instantiate(treePrefab, loadTreePosition, loadTreeRotation); lanzar una excepción y eso evita más iteraciones de ciclo. Intenta cerrar Instantiate(); en try .. except y registrar las excepciones detectadas
¡La mayor parte de la API de Unity solo se puede ejecutar en el subproceso principal de Unity!
Está utilizando ContinueWith(Action<Task>) sin un TaskScheduler específico
Crea una continuación que se ejecuta de forma asincrónica cuando se completa la
Taskde destino.
lo que no garantiza que se llame a la devolución de llamada en el subproceso principal, por lo que la última Instantiate falla.
Firebase específico para Unity proporciona el método de extensión de tareas ContinueWithOnMainThread
Métodos de extensión para
System.Threading.Tasks.TaskySystem.Threading.Tasks.Task<T>que permiten ejecutar la función de continuación en el subproceso principal en Unity.
deberías usar aquí
reference.Child("Player").Child(scenarioName).GetValueAsync().ContinueWithOnMainThread(task => { .... }); En general, asegúrese de no haber deshabilitado ningún tipo de registro en la consola. Debería haber visto una advertencia que le indica que Instantiate no se puede usar fuera del hilo principal.