我一直在尝试转换代码(页面上的第二个样本):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命令,错误就会消失,但当然数据不会加载。
请有人帮忙吗? 谢谢。
答案 0 :(得分:1)
您需要更改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
,其中一些不可以: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);
}
}