1

嘿伙计们,我是 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);
    }   
  }
4

3 回答 3

1

您的FindObjectOfType函数由于某种原因返回 null。为什么,只看提供的代码是不可能扣除的。

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

于 2012-04-13T12:28:56.377 回答
1

FindObjectOfType如果您在 unity3d 场景中没有GameObject该类型(在您的情况下),将返回 null 。ClientSideScript

您还需要将您的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 调用的响应。

当你打电话时RegisterUsersRegisterScript你需要使用StartCoroutine(client.RegisterUsers(name, pass));

请参阅 Unity3d WWW 文档Coroutine 文档

于 2012-04-13T15:07:26.243 回答
0

我也遇到过这个问题。

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

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

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

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;
  }
于 2014-03-19T13:53:08.210 回答