【问题标题】:Returning a value IEnumerator返回值 IEnumerator
【发布时间】:2012-04-13 12:25:05
【问题描述】:

大家好,我是 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);
    }   
  }

【问题讨论】:

标签: c# unity3d ienumerable


【解决方案1】:

如果您的 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 documentation 和 Coroutine documentation

【讨论】:

  • 嗯?这是如何回答问题的?我仍然无法用这个返回值!你最后只是调用了一个方法!!
【解决方案2】:

您的FindObjectOfType 函数由于某种原因返回空值。 为什么,只看提供的代码是不可能推断出来的。

不是IEnumerable&lt;string&gt; stringcheck = client...,而是前一行(即使我在提供的文本中没有看到行号)

【讨论】:

  • 我应该用什么来代替 IEnumberable ?
  • 只是一个字符串 - 你总是返回 1 个字符串。
  • @racingWild:我再说一遍,这不是关于您的 ClientSideScript 对象恢复的 Enumerable bu(只要能理解提供的代码)
  • @racingWild:查看您的堆栈跟踪,至少在这里提供的那个,我看到的最后一点是 不是 RegisterUsers 方法,而是 OnMouseUp。
  • @JakubKonecki 我厌倦了只使用一个字符串,但它给出了一个错误,说它不是一个迭代器块。
【解决方案3】:

我也遇到过这个问题。

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

【讨论】:

    猜你喜欢
    • 2010-12-15
    • 2014-02-22
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 2017-05-21
    • 2020-07-28
    相关资源
    最近更新 更多