Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

¿Cómo reutilizar código en corutinas? (problema interesante)

Iniciado por Braltor, Abril 10, 2018, 12:32:25 AM

Tema anterior - Siguiente tema
Tengo la curiosidad de qué harían para reutilizar el código de estas corutinas. El caso es que estoy haciendo un cache de recursos cargados con un diccionario. Como uso WWW necesito corutinas, pero esta sólo se crea si no se ha cargado el recurso antes. Estaba buscando si se pueden anidar corutinas pero no van a retornar el resultado de WWW. ¿Alguna solución creativa? No me urge, nada más es un problema interesante.
 
 
 

   Dictionary<string, Object> cacheRecursos = new Dictionary<string, Object> ();
      ...
 
IEnumerator CargaImagen(string url, Image imagen)
{
   Object o = null;
   if (cacheRecursos.ContainsKey (url)) {
      o = cacheRecursos [url];
      if (o == null)
         cacheRecursos.Remove (url);
   }
   if (o == null) {
      var w = new WWW (url);
      yield return w;
      if (w.texture != null) {
         o = Sprite.Create (w.texture, new Rect (0, 0, w.texture.width, w.texture.height), new Vector2 (0.5f, 0.5f));
         cacheRecursos.Add (url, o);
      }
   }
   if (o != null)
      imagen.sprite = o as Sprite;
}
 
IEnumerator CargaSonido(string url, AudioSource audioSource)
{
   Object o = null;
   if (cacheRecursos.ContainsKey (url)) {
      o = cacheRecursos [url];
      if (o == null)
         cacheRecursos.Remove (url);
   }
   if (o == null) {
      var w = new WWW (url);
      yield return w;
      o = w.GetAudioClip(false, true);
      if (o != null)
         cacheRecursos.Add (url, o);
   }
   if (o != null)
      audioSource.clip = o as AudioClip;
}

 
 

Creo que podrias usar https://docs.unity3d.com/ScriptReference/WWW-bytes.html para obtenr un array de bytes y luego transformalo a lo que necesitas, podrias poner condiciones si el archivo termina en .mp3 .wav etc para sonidos y .png para texturas.

podrias hacerlo de la siguiente manera.
 

private T GetResource<T>(T type, string key) where T : UnityEngine.Object
{
//Verificar que no exista el objeto en el diccionario
//Si el objeto existe en el diccionario verificar que el tipo es el correcto
 
     StartCorrutine(IEDownloadResource(string.Format("http://mycompany.com/resources/{0}/{1}", type, key), (www)=>
     {
        swith(type)
        {
           case typeof(Texture) : /*logica de imagen*/ break;
           case typeof(AudioClip) : /*logica de audio*/ break;          
        }
     }));
}
 
private IEnumerator IEDowloadResource(string url, Action<WWW> callBack)
{
  WWW www = new WWW(url);
  yield return www;
  callBack.Invoke(www);
}
 

 
De esa manera lo haría yo...
 
Lo escribi desde la WEB puede tener errores :) saludos.

muy buena @francoe1 al final he reescrito el codigo tomando en cuenta tu aporte... use dos callbacks, uno para la corutina y otro para el cache, de manera q tengo dos funciones q cargan el sprite y el audioclip de forma independiente... ha quedado muy sencillo y elegante, gracias!

Etiquetas: