Создание запроса post в Unity на Windows Phone 8

Я пытаюсь сделать запрос post на windows phone 8 с платформы Unity. Я не хочу использовать метод unity WWW, поскольку это блокирует рендеринг (и не является потокобезопасным).

следующий код работает в редакторе и на Android, но при его создании для WP8 я получаю следующую ошибку.

4 ответов


Я не знаю о каких-либо потенциальных ограничениях, наложенных на вас Unity, но Windows Phone 8 имеет WebClient.UploadStringAsync метод и WebClient.UploadStringCompleted событие именно за это.

HttpWebRequest также должен работать (опять же, я не знаю о каких - либо ограничениях единства-см. комментарий выше с просьбой разъяснить).


перейти к работе на windows phone с помощью кода ниже. Компилируется и запускается в редакторе, на Android и на WP8 (yay!). Еще не пробовал его на iOS.

и написал об этом пост здесь:создание веб-запросов для unity, которые работают на всех платформах, даже WP8

/// <summary>
/// Make post request to url with given paramaters
/// </summary>
/// <param name="url">URL to post data to http://server.com/method </param>
/// <param name="data">{ Data: data }</param>
/// <returns>string server response</returns>
public string PostData(string url, string data)
{
    // json request, hard coded right now but use "data" paramater to set this value.
    string jsonRequest = "{\"Data\": \"data\"}"; // the json request

    var request = System.Net.WebRequest.Create(url) as System.Net.HttpWebRequest;

    // this could be different for your server
    request.ContentType = "application/json"; 

    // i want to do post and not get
    request.Method = "POST"; 

    // used to check if async call is complete
    bool isRequestCallComplete = false;

    // store the response in this
    string responseString = string.Empty;

    request.BeginGetRequestStream(ar =>
    {
        var requestStream = request.EndGetRequestStream(ar);
        using (var sw = new System.IO.StreamWriter(requestStream))
        {
            // write the request data to the server
            sw.Write(jsonRequest);

            // force write of all content 
            sw.Flush();
        }

        request.BeginGetResponse(a =>
        {
            var response = request.EndGetResponse(a);
            var responseStream = response.GetResponseStream();
            using (var sr = new System.IO.StreamReader(responseStream))
            {
                // read in the servers response right here.
                responseString = sr.ReadToEnd();
            }
            // set this to true so the while loop at the end stops looping.
            isRequestCallComplete = true;
        }, null);

    }, null);

    // wait for request to complete before continuing
    // probably want to add some sort of time out to this 
    // so that the request is stopped after X seconds.
    while (isRequestCallComplete == false) { Thread.Sleep(50); }

    return responseString;
}

вы не можете использовать эти фреймворки из unity, потому что они потоковые / асинхронные / используют другую версию .Net

короче :

  • Unity работает на версии mono, которая принимает только .Net 3.5
  • единство не позволяет заводить темы, задачи или что-нибудь близкое к реальному asynchronicity
  • вы можете реализовать их, хотя.

для этого на windows phone вам нужно будет создать библиотеку классов (две на самом деле), что unity вызывает плагин

Так почему две библиотеки DLL?

потому что редактору нужен макет dll (или фактический, если вы хотите реализовать его для рабочего стола), который реализует тот же интерфейс, что и dll, совместимый на windows phone.

для ясности :

  • dll для редактора (в активах / плагинах) должна быть совместима с .Net 3.5 и desktop
  • dll, размещенная в активах / плагинах/WP8, должна быть совместима с Windows phone Подмножество .Net (как я помню, вы можете быть .Net 4.5 без pb)

поэтому вы должны реализовать эту функциональность в dll, а затем ссылаться на нее в unity и, наконец, вызвать ее напрямую.

все объясняется здесь:http://docs.unity3d.com/Manual/wp8-plugins-guide-csharp.html

Это проще, чем кажется.


Я знаю, вы сказали, что не хотите использовать класс WWW, но причины, которые вы дали, не имеют смысла IMO.

Если вы используете корутину для проверки ".isdone " флаг и не проверять его с помощью потока.Sleep () он не блокирует рендеринг и является потокобезопасным (поскольку unity дает вам доступ только к его информации в одном потоке).

Если вы хотите получить доступ к возвращаемым данным в другом потоке, вам просто нужно прочитать эти данные в основном потоке unity, а затем передать его любой поток, на котором вы хотите его использовать.

единство по дизайну все работает на одном потоке, чтобы сделать жизнь проще для менее опытных программистов. Хотя вы должны иметь возможность создавать несколько потоков с помощью .NET threading, вы не сможете напрямую связываться с любыми компонентами Unity, но вы можете передать данные обратно в Unity и дождаться обновления или другого вызова Unity для использования данных. Я знаю, что это не отвечает на ваш вопрос точно, но если вы не можете решить его, я думаю, что это будет стоит еще раз взглянуть на класс WWW и лучшие практики его использования.