2016-09-27 1 views
1

J'utilise DownloadHandlerTexture.GetContent pour obtenir ma texture:Faire un Texture2D lisible dans l'unité lors du chargement du serveur

www = UnityWebRequest.GetTexture("http://www.example.com/loadTex/?tag=" + tag); 
www.SetRequestHeader("Accept", "image/*"); 
async = www.Send(); 
while (!async.isDone) 
    yield return null; 

if (www.isError) { 
    Debug.Log(www.error); 
} else { 
    yield return null; 
    tex = DownloadHandlerTexture.GetContent(www); 
} 

Après le chargement, je voudrais le mettre en cache dans un fichier pour moi:

byte[] pic = tex.EncodeToPNG(); 
File.WriteAllBytes(Application.persistentDataPath + "/art/" + tag + ".png", pic); 

A ce stade, je reçois l'exception:

UnityException: Texture '' is not readable, the texture memory can not be accessed from 
scripts. You can make the texture readable in the Texture Import Settings. 

Je pense que je dois le rendre lisible en quelque sorte. Je l'ai googlé, mais les seules réponses que je reçois est de savoir comment le rendre lisible par l'éditeur.

Répondre

2

Vous pouvez stocker les données à partir de UnityWebRequest. Qu'est-ce que vous êtes dong je un peu inutile dans ce but. Vous transformez le résultat en texture pour convertir la texture en byte [].

byte[] bytes = www.uploadHandler.data; 
File.WriteAllBytes(Application.persistentDataPath + "/art" + tag, data); 

Je suppose que cela devrait faire l'affaire. Pas besoin de l'extension .png lorsque vous stockez un tableau brut d'octets. Vous obtiendrez alors le tableau et créer une texture hors de lui:

byte [] bytes = File.ReadAllBytes(Application.persistentDataPath + "/art" + tag); 
Texture2D texture = new Texture2D(4,4,TextureFormat.RGBA32, false); 
texture.LoadImage(bytes); 
+0

Je m chargement de texture pour l'utiliser dans mes modèles. Mais quand le programme se termine, j'essaye de le mettre en cache dans les fichiers. La raison pour laquelle j'utilise 'DownloadHandlerTexture.GetContent' est parce qu'elle est optimisée pour la mémoire. – serge

+0

Au lieu de mettre en cache à la fin, mettez en cache lorsque vous l'obtenez. C'est tout à fait pareil. – Everts

+0

Semble raisonnable, je vais essayer quand je rentre à la maison, et signaler bientôt. Il est également moins efficace de charger la texture à partir d'octets au lieu d'utiliser 'DownloadHandlerTexture.GetContent' – serge

2

Je voulais juste signaler que UnityWebRequest.GetTexture peut prendre deux paramètres: l'url et un bool pour rendre la texture lisible ou non :) Donc, avant d'utiliser DownloadHandlerTexture.GetContent pour obtenir la texture dans le résultat de la requête. Appelez simplement UnityWebRequest.GetTexture (url, false); donc la texture téléchargée devient lisible. PS: Attention, avant Unity 5.6, le bool nonReadable est inversé. Ils auraient dû le fixer à partir de 5.6 (selon les notes de version).

Pour rendre votre texture lisible:

  • Avant 5.6: UnityWebRequest.GetTexture (url, true)
  • Après 5,6: UnityWebRequest.GetTexture (url, false)