嘿伙计我是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);
}
}
答案 0 :(得分:1)
由于某种原因,您的FindObjectOfType
函数返回null。
为什么,只能根据所提供的代码来推断。
它不是 IEnumerable<string> stringcheck = client...
,而是之前的一行(即使我没有在提供的文字上看到行号)
答案 1 :(得分:0)
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 documentation和Coroutine 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;
}