yield和WWWForm错误

时间:2011-06-15 04:59:08

标签: c# unity3d

我一直在尝试转换代码(页面上的第二个样本):http://unity3d.com/support/documentation/ScriptReference/WWWForm.html

..到Unity3D中的C#:

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 个答案:

答案 0 :(得分:1)

您需要更改Start()的返回类型,Start回调支持voidIEnumerator,因为它是返回类型。

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,其中一些不可以:Awake,Update,LateUpdate,FixedUpdate,OnGUI,OnEnable,OnDisable,OnDestroy。您需要检查事件回调的文档,看它是否不支持作为协同例程。

答案 1 :(得分:0)

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