Unity3d: Actividad de red de fondo y Unity Run Loop

Estamos buscando una manera de descargar "al mismo tiempo en segundo plano" diversos recursos que nuestro juego necesitará "pronto". Nuestras necesidades son: (1) máxima velocidad de descarga posible, (2) mínima interrupción posible de las actividades de "primer plano" Runloop que están impulsando el juego, (3) la solución funciona muy bien en todas las plataformas principales que nos interesan (Android / iOS / PC / Mac), y (4) la ausencia de errores que debilitan la solución.

Si no cumplimos con el requisito # 1, entonces el juego tiene que parar y hacer que el usuario espere hasta que la descarga de fondo se acerque y entregue los recursos necesarios. Si no cumplimos con el requisito # 2, entonces la descarga de fondo impacta negativamente cómo juega el juego, haciéndolo desigual o lento para responder, etc.

Hemos intentado e investigado varios enfoques, incluidos Asset Bundles, WWW y nativos C # HttpWebRequest, y ninguno de ellos cumple con todos nuestros requisitos. Detalles abajo.

Nos encantaría conversar con usted si ya ha descubierto cómo solucionar este problema, porque preferimos no reinventar la rueda.

Aquí están los detalles de nuestra experiencia hasta ahora:

Tenemos una aplicación para Android integrada en Unity, que eventualmente también estará disponible a través de iOS. Junto con las actividades normales de primer plano, tenemos una actividad de fondo de baja prioridad de descarga de varios recursos para ser utilizados por la aplicación en primer plano.

(Antes de pedir, los paquetes de activos no funcionarán para nosotros, ya que, a menos que algo haya cambiado recientemente, no funcionen en diferentes versiones de Unity, es decir, un paquete de activos para Unity 3.4 no funciona en Unity 3.5. para volver a descargar todos sus activos de nuevo.)

Desafortunadamente, hemos descubierto una serie de errores molesto con el uso del componente 'WWW'. Estos incluyen no actualizar cuando hay una pérdida de red, y no devolver valores de las solicitudes web (es decir, 'post'). Como tal, estamos buscando reemplazar nuestro uso de WWW con el nativo C # HttpWebRequest. Desafortunadamente, hemos encontrado que usar este componente en el Unity Runloop principal a través de una co-rutina hace que el runloop se detenga y que la interfaz de usuario se congele.

Sin embargo, la colocación de este mismo código en un hilo de fondo C # (no una co-rutina) y luego de sondeo que el hilo de la actividad no parece funcionar.

No nos gusta este enfoque ya que esto nos permite programar esta actividad en ausencia que está en armonía con el programador Unity. Nos gustaría que la actividad de la red (y la CPU asociada) se ejecute en espacios apropiados en el Unity Run Loop. Pero por lo que podemos decir, sólo hay tres maneras en que podemos especificar la prioridad:

  • WWW.threadPriority – no queremos utilizar WWW por lo que es mudo.
  • Application.backgroundLoadingPriority – Como no estamos usando un componente Unity (como AssetBundles) para hacer la descarga, estoy asumiendo que esto no tiene efecto?
  • YieldInstructions, por ejemplo, WaitForSeconds y WaitForFixedUpdate – Mi comprensión es que estos son bastante tonto. Se ejecutan cuando están programados para ejecutarse y no se aplazan a las necesidades de Unity Run Loop?

Lo que estamos tratando de entender: – ¿WWW está lleno de problemas o es sólo nuestro uso del componente? – ¿Alguien ha utilizado HttpWebRequest con una aplicación de Unity correctamente? ¿Lo han hecho de una manera roscada? – ¿Hay alguna arquitectura de 'interrupción' o 'prioridad' en Unity para que las tareas de fondo puedan jugar bien con el Unity Runloop y no causar problemas o competencia?

Una búsqueda rápida de google encontró que esta bruja puede funcionar si no quieres usar WWW. También hay el webclient en el system.net que he usado antes, pero no dentro de la unidad, pero sé que tiene una descarga asíncrona, la usé aquí

Ejemplo de webclient:

WebClient webClient = new WebClient(); webClient.DownloadProgressChanged += OnChange; webClient.DownloadFileCompleted += OnCompleted; webClient.DownloadFileAsync(new Uri(download), fileAndPath); 
  • El proyecto Build Unity con Jenkins falló
  • ¿Cómo subir un juego de unidad que es más de 50 mb a google playstore?
  • ¿Cómo mostrar la misma parte del juego en cada relación de aspecto en dispositivos Android con Unity?
  • UnitySendMessage no funciona de la actividad no-unidad
  • Entrada de un juego de ritmo
  • UnityWebRequest Incorporación de datos de usuario y contraseña para la autenticación HTTP básica que no funciona en Android
  • UnityPlayerActivity no recibe registro onCreate ()
  • Unity c #, tomar captura de pantalla y guardar en archivo como jpg
  • Arrastre con velocidad en el juego Unity no igual dependiendo de la resolución
  • Cómo encontrar el origen de un permiso en Unity Android
  • Cómo hacer la animación 2D en Unity
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.