2012-04-13 351 views
1

嗨,大家好我是新来的C#和untiy我通常开发Java,并有一个问题,使用IEnumerator返回一个值。基本上我有一个客户端脚本,它将用户名和密码注册到服务器上的数据库中。我的问题是,当我点击一个按钮时,应调用客户端脚本中的方法,将用户输入的用户名和密码添加到数据库中。负责这个的方法应该返回一个字符串,表明注册成功/不成功。当我尝试实现这个我得到以下错误:返回一个值IEnumerator

“的NullReferenceException:未设置为一个对象 RegisterScript.OnMouseUp的实例对象引用()(在资产/脚本/ RegisterScript.cs:23) UnityEngine。 SendMouseEvents:DoSendMouseEvents()“

以下是两个类的代码,感谢任何人可以帮助!附接到通过用户名和密码的客户端脚本

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

从这个上面的代码,我没有看到任何可以被IEnumerable的。 – 2012-04-13 12:28:02

+0

相关,并有更好的解决方案imho:http://answers.unity3d.com/questions/207733/can-coroutines-return-a-value.html – cregox 2012-09-26 16:08:30

回答

0

FindObjectOfType将返回null如果YOUT没有该类型的GameObject(在你的案例ClientSideScript)在你的unity3d场景中。

你还需要改变你的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电话响应。

而当你从RegisterScriptRegisterUsers你需要使用StartCoroutine(client.RegisterUsers(name, pass));

看到Unity3d WWW documentationCoroutine documentation

+0

嗯?这是如何回答这个问题的?我仍然无法用此回报价值!你只是在最后调用一个方法! – cregox 2012-09-26 16:08:04

1

FindObjectOfType函数返回一个空因某种原因按钮

客户端脚本

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

注册脚本。 为什么仅仅根据提供的代码来推导是不可能的。

IEnumerable<string> stringcheck = client...,但在此之前(即使我没有看到提供的文本行号)线

+0

我应该用什么来代替IEnumberable? – racingWild 2012-04-13 12:30:31

+0

只是一个字符串 - 你总是返回1个字符串。 – 2012-04-13 12:31:17

+0

@racingWild:我再说一遍,这不是关于您的ClientSideScript对象恢复的可枚举bu(尽可能多的理解所提供的代码) – Tigran 2012-04-13 12:31:36

0

我碰到过这样的问题太多。

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

2.所以我想指针,但统一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; 
    }