yield и ошибка WWWForm - PullRequest
       10

yield и ошибка WWWForm

1 голос
/ 15 июня 2011

Я пытался преобразовать код в (2-й пример на странице): http://unity3d.com/support/documentation/ScriptReference/WWWForm.html

.. в C # в Unity3D:

void Start () 
{   
    string dataUrl = "http://www.my-site.com/game/test.php";
    string playName = "Player 1";
    int score = -1;

    // Create a form object for sending high score data to the server
    var form = new WWWForm();
    // Assuming the perl script manages high scores for different games
    form.AddField( "game", "MyGameName" );
     // The name of the player submitting the scores
    form.AddField( "playerName", playName );
     // The score
    form.AddField( "score", score );

    // Create a download object
    WWW downloadW = new WWW( dataUrl, form );

    // Wait until the download is done
    yield return downloadW;


    if(downloadW.error == null) {
        print( "Error downloading: " + downloadW.error );
        return false;
    } else {
        // show the highscores
        Debug.Log(downloadW.text);
    }
}

Я получаю следующееошибка:

ошибка CS1624: тело rr2game.Start()' cannot be an iterator block because void 'не является типом интерфейса итератора

После некоторого чтения я попытался изменить void Start () наIEnumerator Start () .. но он говорит, что IEnumerator не объявлен ..?

Если я закомментирую команду yield, ошибки исчезнут, но, конечно, данные не загружаются.

Пожалуйста, кто-нибудь может помочь?Спасибо.

Ответы [ 2 ]

1 голос
/ 30 ноября 2016

Вам нужно изменить тип возвращаемого значения Start(), обратный вызов Start поддерживает оба типа void и IEnumerator в качестве типов возврата.

IEnumerator Start () 
{   
    string dataUrl = "http://www.my-site.com/game/test.php";
    string playName = "Player 1";
    int score = -1;

    // Create a form object for sending high score data to the server
    var form = new WWWForm();
    // Assuming the perl script manages high scores for different games
    form.AddField( "game", "MyGameName" );
     // The name of the player submitting the scores
    form.AddField( "playerName", playName );
     // The score
    form.AddField( "score", score );

    // Create a download object
    WWW downloadW = new WWW( dataUrl, form );

    // Wait until the download is done
    yield return downloadW;


    if(downloadW.error == null) {
        print( "Error downloading: " + downloadW.error );
        return false;
    } else {
        // show the highscores
        Debug.Log(downloadW.text);
    }
}

Если тип возвращаемого значения IEnumerator, вы можете использовать ключевое слово yield.

Большинство обратных вызовов позволяют вернуть IEnumerator, некоторые из которых не могут быть: Пробуждение, Обновление, LateUpdate, FixedUpdate, OnGUI, OnEnable, OnDisable, OnDestroy. Вам нужно будет проверить документацию обратного вызова события, чтобы узнать, не поддерживает ли он сопрограмму.

0 голосов
/ 26 июня 2015

yield не может использоваться в функции Start (), его нужно вызывать в своем собственном потоке, вместо этого попробуйте следующее:

void Start()
{
    StartCoroutine(SaveScore());
}

IEnumerator SaveScore() 
{   
    string dataUrl = "http://www.my-site.com/game/test.php";
    string playName = "Player 1";
    int score = -1;

    // Create a form object for sending high score data to the server
    var form = new WWWForm();
    // Assuming the perl script manages high scores for different games
    form.AddField( "game", "MyGameName" );
     // The name of the player submitting the scores
    form.AddField( "playerName", playName );
     // The score
    form.AddField( "score", score );

    // Create a download object
    WWW downloadW = new WWW( dataUrl, form );

    // Wait until the download is done
    yield return downloadW;


    if(!string.IsNullOrEmpty(downloadW.error)) {
        print( "Error downloading: " + downloadW.error );
    } else {
        // show the highscores
        Debug.Log(downloadW.text);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...