2012-04-13 3 views
1

Привет, ребята, я новичок в C# и untiy Я обычно разрабатывал Java и имею проблему, возвращающую значение с помощью IEnumerator. В основном у меня есть клиентский скрипт, который регистрирует имя пользователя и пароль для базы данных на сервере. Моя проблема заключается в том, что, когда я нажимаю кнопку, метод в скрипте на стороне клиента должен вызываться, чтобы добавить в базу данных вход пользователя для имени пользователя и пароля. Метод, который отвечает за это, должен вернуть строку, указывающую, что регистрация была успешной/неудачной. Когда я пытаюсь реализовать это, я получаю следующее сообщение об ошибке:Возвращение значения IEnumerator

"NullReferenceException: ссылка на объект не указывает на экземпляр объекта RegisterScript.OnMouseUp() (на активы/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); 
    } 
    } 
+1

Из этого верхнего кода, я не вижу ничего, что может быть IEnumerable. –

+0

связано, и с лучшим решением imho: http://answers.unity3d.com/questions/207733/can-coroutines-return-a-value.html – cregox

ответ

0

FindObjectOfType будет возвращать нулевое значение, если Yout не имеют GameObject этого типа (в вашем случай ClientSideScript) в вашем единстве3d scene.

Вам также необходимо изменить метод 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

+0

Хм? Как это отвечает на вопрос? Я все еще не могу вернуть значение с этим! Вы просто вызываете метод в конце! – cregox

1

Вашей FindObjectOfType функция возвращает нулевой по некоторым причинам. Почему вы не можете вычитать, глядя только на предоставленный код.

Это неIEnumerable<string> stringcheck = client..., но линия раньше (даже если я не вижу номера строк текста, предоставленного)

+0

что я должен использовать вместо IEnumberable? – racingWild

+0

Просто строка - вы всегда возвращаете 1 строку. –

+0

@racingWild: Повторяю, это не о перечислимом буфере восстановления вашего объекта ClientSideScript (насколько это возможно для понимания кода) – Tigran

0

Я наткнулся на эту проблему тоже.

1.I думаю о поместить выходную переменную в список параметров.

2.So Я думаю о указателе, но единство 3d use safe C#, который не имеет указателя.

3.then Я думаю о «ref» или «out» в C#, но функция return IEnumerator не может использовать «ref» или «out» в списке параметров в 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; 
    } 
Смежные вопросы