2016-09-27 3 views
1

lade ich DownloadHandlerTexture.GetContent bin mit meiner Textur zu erhalten:ein Texture2D lesbar in Unity zu machen, wenn sie von Server

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); 
} 

Nach dem Laden würde ich es in einer Datei zwischenspeichern möchte ich auch:

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

an diesem Punkt erhalte ich die Ausnahme:

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. 

ich denke, dass ich es irgendwie lesbar machen müssen. Ich habe es gegooglet, aber die einzigen Antworten, die ich bekomme, sind, wie man es durch den Editor lesbar macht.

Antwort

2

Sie könnten die Daten von UnityWebRequest speichern. Was du bist, bin ich ein bisschen nutzlos für diesen Zweck. Sie verwandeln das Ergebnis in eine Textur, um die Textur zurück in Byte [] zu konvertieren.

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

Ich denke, das sollte tun. Keine Notwendigkeit für die Erweiterung .png beim Speichern eines rohen Arrays von Bytes. Sie erhalten dann die Array erhalten und eine Textur aus ihm heraus erstellen:

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

Ich

Um Ihre Textur lesbar zu machen Laden von Texturen, um es in meinen Modellen zu verwenden. Aber wenn das Programm endet, versuche ich es in die Dateien zu cachen. Der Grund, warum ich 'DownloadHandlerTexture.GetContent' verwende, ist, dass es für den Speicher optimiert wurde. – serge

+0

Anstatt am Ende Caching, Cache, wenn Sie es bekommen. Es ist ziemlich dasselbe. – Everts

+0

Klingt vernünftig, ich werde versuchen, wenn ich nach Hause komme, und melden Sie sich bald. Es ist auch weniger effizient, Textur aus Bytes zu laden, anstatt 'DownloadHandlerTexture.GetContent' zu verwenden. – serge

2

Ich wollte nur darauf hinweisen, dass UnityWebRequest.GetTexture zwei Parameter annehmen kann: die URL und eine Bool die Textur lesbar oder nicht zu machen :) https://docs.unity3d.com/ScriptReference/Networking.UnityWebRequest.GetTexture.html

Bevor Sie also DownloadHandlerTexture.GetContent verwenden, um die Textur im Anforderungsergebnis zu erhalten. Rufen Sie einfach UnityWebRequest.GetTexture (url, false) auf; So wird die heruntergeladene Textur lesbar.

PS: Vorsicht, vor Unity 5.6 wird der bool nonReadable invertiert. Sie sollten es ab 5.6 (laut Release Notes) behoben haben.

  • Vor 5.6: UnityWebRequest.GetTexture (url, true)
  • Nach 5.6: UnityWebRequest.GetTexture (url, true)
Verwandte Themen