返回值IEnumerator

时间:2012-04-13 12:25:06

标签: c# unity3d ienumerable

嘿伙计我是c#的新手并且不熟悉我经常开发Java并且在使用IEnumerator返回值时遇到问题。基本上我有一个客户端脚本,它将用户名和密码注册到服务器上的数据库。我的问题是,当我单击一个按钮时,应该调用客户端脚本中的方法,将用户输入的用户名和密码添加到数据库中。负责此操作的方法应该返回一个字符串,表明注册成功/不成功。当我尝试实现这一点时,我收到以下错误:

“NullReferenceException:对象引用未设置为对象的实例 RegisterScript.OnMouseUp()(在Assets / Scripts / RegisterScript.cs:23) UnityEngine.SendMouseEvents:DoSendMouseEvents()“

以下是两个课程的代码,感谢任何可以提供帮助的人!

客户端脚本

using UnityEngine;
using System.Collections;
using System.Collections.Generic;


public class ClientSideScript : MonoBehaviour {

public string RegUserUrl = "http://localhost/reguser.php?";


public IEnumerable<string> RegisterUsers(string name , string pass){

    string post_url = registerUser + "name=" + name + "&pass=" + pass;
    print (post_url);
    WWW hs_post = new WWW(post_url);
    string check = hs_post.ToString();
    yield return check;

    //return regname;
 }
 }

附加到按钮的注册脚本,该按钮将用户名和密码传递给客户端脚本

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class RegisterScript : MonoBehaviour {
public string Registeredpassword;
public string Registeredusername;
public Texture2D registerButton;



//Use this for initialization
void OnGUI () {

Registeredpassword = GUILayout.PasswordField(Registeredpassword, "*"[0], 25);
Registeredusername = GUILayout.TextField(Registeredusername, 25);

}

void OnMouseUp(){

ClientSideScript client =          (ClientSideScript)FindObjectOfType(typeof(ClientSideScript));
 IEnumerable<string> stringcheck = client.RegisterUsers(Registeredusername ,      Registeredpassword);
 print (stringcheck);
    }   
  }

3 个答案:

答案 0 :(得分:1)

由于某种原因,您的FindObjectOfType函数返回null。 为什么,只能根据所提供的代码来推断。

不是 IEnumerable<string> stringcheck = client...,而是之前的一行(即使我没有在提供的文字上看到行号)

答案 1 :(得分:0)

如果您的unity3d场景中没有该类型的FindObjectOfType(在您的情况下为GameObject),

ClientSideScript将返回null。

您还需要将RegisterUsers方法更改为此类

public IEnumerator RegisterUsers(string name , string pass){

string post_url = registerUser + "name=" + name + "&pass=" + pass;
print (post_url);
WWW hs_post = new WWW(post_url);

// wait for www to get a response
yield return hs_post;

// now do something with the returned value
// cant return it directly as this is a unity3d coroutine
string response = hs_post.text;
DealWithResponse(reponse)

}

它有IEnumerator返回类型,因为它需要是一个统一协程,因此游戏不会等待对您的www通话的响应。

当您从RegisterUsers致电RegisterScript时,您需要使用StartCoroutine(client.RegisterUsers(name, pass));

请参阅Unity3d WWW documentationCoroutine documentation

答案 2 :(得分:0)

我也遇到过这个问题。

1.我想把输出变量放在参数列表中。

2.所以我想到了指针,但是统一3d使用了没有指针的安全c#。

3.然后我想到&#34; ref&#34;或&#34; out&#34;在c#中,但函数返回IEnumerator不能使用&#34; ref&#34;或&#34; out&#34;在c#的参数列表中。

4.Finial我想我可以用安全的东西在安全的c#中写一个指针。

这是我的解决方案:

//a pointer to another object..
public class Pointer<T>
{
    public T data;

    public Pointer(){
    }
    public Pointer(T data){
        this.data = data;
    }
}

  public IEnumerator RegisterUsers(string name , string pass,Pointer<string> errPtr){
    string post_url = registerUser + "name=" + name + "&pass=" + pass;
    print (post_url);
    WWW hs_post = new WWW(post_url);

    // wait for www to get a response
    yield return hs_post;

    //return it in parameter
    errPrt.data = hs_post.text;
  }