Returning a value IEnumerator

本文关键字:IEnumerator value Returning | 更新日期: 2023-09-27 18:30:56

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

" NullReferenceException:对象引用未设置为对象的实例RegisterScript.OnMouseUp () (at 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);
    }   
  }

Returning a value IEnumerator

如果您在 unity3d 场景中没有该类型的GameObject(在您的情况下ClientSideScript),FindObjectOfType将返回 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 调用的响应。

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

请参阅 Unity3d WWW 文档和协程文档

由于某种原因,您的FindObjectOfType函数返回 null。为什么,仅凭提供的代码就无法推断

出。

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

我也遇到了这个问题。

1.我考虑将输出变量放在参数列表中。

2.So 我想到了指针,但 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;
  }