Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

258
Vistas
bucle foreach iterando solo una vez? C# Unity3D

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 } } } }
over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

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

over 4 years ago · Santiago Trujillo Denunciar

0

¡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 Task de 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.Task y System.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.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda