Erstellen einer Postanforderung in Unity unter Windows Phone 8

9

Ich versuche eine Post-Anfrage auf Windows Phone 8 von der Unity-Plattform zu machen. Ich möchte nicht die Unity-WWW-Methode verwenden, da dies das Rendering blockiert (und nicht threadsicher ist).

Der folgende Code funktioniert im Editor und auf Android, aber wenn ich ihn für WP8 erstelle, erhalte ich den folgenden Fehler.

  

System.Byte [] System.Net.WebClient :: UploadData (System.String, System.String, System.Byte []) 'existiert nicht im Zielframework.

Der Grund für diesen Fehler wird hier erklärt

  

Es liegt daran, dass Windows Phone 8 eine andere .NET-Variante namens .NET für Windows Phone verwendet, in der einige der auf anderen Plattformen verfügbaren Typen fehlen. Sie müssen diese Typen entweder durch andere ersetzen oder selbst implementieren.   - Ссылка

Dies ist mein Code

%Vor%

Ich habe auch WebRequests versucht, aber GetResponse () bricht es, und HttpClient existiert nicht.

Also, wie poste ich Daten in Unity, ohne WWW zu verwenden, auf Windows Phone 8?

AKTUALISIERUNG NACH KOMMENTARANFORDERUNG - WebRequests

Dieser Code, der HttpWebRequest verwendet, funktioniert im Editor und auf Android, aber auf Windows Phone wirft die Fehler unter dem Code.

%Vor%

Fehler 1:

  

Fehler: Methode System.IO.Stream System.Net.HttpWebRequest::GetRequestStream() existiert nicht im Zielframework.

Fehler 2:

  

System.Net.WebResponse System.Net.HttpWebRequest::GetResponse() existiert nicht im Zielframework.

UPDATE MIT MEHREREN DETAILS - UploadStringAsync

Wenn Sie diesen Code benutzen, um eine asynchrone Anfrage zu machen, dann funktioniert er wieder gut im Editor, Fehler werden auf den WP8 geworfen.

%Vor%

Fehler 1

  

Methode System.Void System.Net.WebClient::add_UploadDataCompleted(System.Net.UploadDataCompletedEventHandler) existiert nicht im Zielframework.

Fehler 2

  

Fehler: Methode System.Void System.Net.WebClient::UploadDataAsync(System.Uri,System.Byte[]) existiert nicht im Zielframework.

Fehler 3

  

Fehler: Geben Sie System.Net.UploadDataCompletedEventArgs nicht im Zielframework ein.

Fehler 4

  

Fehler: Methode System.Byte[] System.Net.UploadDataCompletedEventArgs::get_Result() existiert nicht im Zielframework.

    
JensB 24.06.2015, 21:29
quelle

4 Antworten

1

Gehen Sie mit dem unten stehenden Code auf das Windows Phone. Kompiliert und läuft im Editor, auf Android und auf WP8 (yay!). Habe es noch nicht auf iOS ausprobiert.

schrieb auch einen Beitrag darüber hier: Erstellen Sie Web-Anfragen für die Einheit, die auf allen Plattformen funktionieren, sogar WP8

%Vor%     
JensB 01.07.2015, 07:30
quelle
1

Ich kenne keine möglichen Einschränkungen von Unity, aber Windows Phone 8 hat das WebClient.UploadStringAsync Methode und die WebClient.UploadStringCompleted event , um genau das zu tun.

HttpWebRequest sollte ebenfalls funktionieren (ich kenne keine Unity-Einschränkungen - siehe obigen Kommentar, der um Klärung bittet).

    
Peter Torr - MSFT 27.06.2015 22:28
quelle
0

Sie können diese Frameworks nicht als Einheit verwenden, da sie Threaded / Async sind / eine andere Version von .Net verwenden

Kurz gesagt:

  • Unity läuft auf einer Version von mono, die nur .Net 3.5
  • akzeptiert
  • Unity erlaubt Ihnen nicht, Threads, Tasks oder irgendetwas in der Nähe von echter Asynchronität zu starten
  • Sie können diese jedoch implementieren.

Um dies auf Windows Phone zu tun, müssen Sie eine Klassenbibliothek erstellen (zwei in der Tat), welche Einheit ein Plugin

aufruft

Warum also zwei dlls?

Weil der Editor eine Mockup-DLL benötigt (oder die tatsächliche, wenn Sie sie auch für den Desktop implementieren wollen), die die gleiche Schnittstelle wie die DLL implementiert, die mit Windows Phone kompatibel ist.

Um es klar zu sagen:

  • Die DLL für den Editor (in Assets / Plugins) muss kompatibel sein .Net 3.5 und Desktop
  • Die in Assets / plugins / WP8 platzierte DLL muss mit Windows Phone kompatibel sein .Net-Subset (wie ich mich erinnere, kann man .Net 4.5 ohne Pb sein)

Sie sollten diese Funktionalität also in einer DLL implementieren, dann auf die Einheit verweisen und sie schließlich direkt aufrufen.

Alles wird hier erklärt: Ссылка

Es ist einfacher als es aussieht.

    
Géry Arduino 30.06.2015 08:23
quelle
0

Ich weiß, du hast gesagt, du willst die WWW-Klasse nicht benutzen, aber die Gründe, die du angegeben hast, machen IMO nicht Sinn.

Wenn Sie eine Coroutine verwenden, um das Flag ".isDone" zu überprüfen und es nicht mit Thread.Sleep () zu überprüfen, blockiert es das Rendering nicht und ist threadsicher (da unity nur Zugriff auf seine Informationen zu einem einzelnen Thread bietet ).

Wenn Sie auf die Rückgabedaten eines anderen Threads zugreifen möchten, müssen Sie nur diese Daten im Unity-Hauptthread lesen und sie dann an den Thread weiterleiten, auf dem Sie sie verwenden möchten.

Unity by Design ist ein Run auf einen einzelnen Thread, um weniger erfahrenen Programmierern das Leben zu erleichtern. Obwohl Sie in der Lage sein sollten, mehrere Threads mit .NET-Threading zu erstellen, können Sie nicht direkt mit Unity-Komponenten kommunizieren, aber Sie können die Daten zurück an Unity übergeben und warten, bis Update oder ein anderer Aufruf von Unity die Daten verwendet. Ich weiß, dass dies Ihre Frage nicht genau beantwortet, aber wenn Sie es nicht lösen können, denke ich, dass es sich lohnen würde, sich erneut mit der WWW-Klasse und den Best Practices bei ihrer Verwendung zu befassen.

    
Colton White 30.06.2015 23:59
quelle