2012-04-13 8 views
1

Hey Leute Ich bin neu zu C# und untiy Ich entwickelte normalerweise Java und habe ein Problem, einen Wert mit IEnumerator. Grundsätzlich habe ich ein clientseitiges Skript, das einen Benutzernamen und ein Passwort zu einer Datenbank auf einem Server registriert. Mein Problem ist, dass wenn ich auf eine Schaltfläche klicke, die Methode im clientseitigen Skript aufgerufen werden soll, um die Benutzereingabe für ihren Benutzernamen und ihr Passwort in die Datenbank einzufügen. Die Methode, die dafür verantwortlich ist, sollte eine Zeichenfolge zurückgeben, die angibt, dass die Registrierung erfolgreich/nicht erfolgreich war. Wenn ich versuche, dies zu implementieren bekomme ich folgende Fehlermeldung:Einen Wert zurückgeben IEnumerator

"Nullreferenceexception: Objektverweis nicht auf eine Instanz eines Objekts RegisterScript.OnMouseUp gesetzt() (bei Aktiva/Scripts/RegisterScript.cs: 23) UnityEngine. SendMouseEvents: DoSendMouseEvents() "

Unten ist der Code der beiden Klassen dank an alle, die helfen können!

Client-Seite Skript

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

Registrierung Skript einer Schaltfläche zugewiesen, die den Benutzernamen und das Passwort an die Client-Seite Skript übergibt

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

Von diesem oberen Code, ich nicht alles sehen, die IEnumerable sein kann. –

+0

verwandt, und mit einer besseren Lösung imho: http://answers.unity3d.com/questions/207733/can-corutines-return-a-value.html – cregox

Antwort

0

FindObjectOfType zurückkehren wird null, wenn yout (keine GameObject dieser Art haben in Ihrem Fall ClientSideScript) in Ihrer unity3d Szene.

Sie werden auch Ihre RegisterUsers Methode, um so etwas wie dieses

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) 

ändern müssen}

Es hat einen IEnumerator Rückgabetyp, wie es braucht, ist eine Einheit Koroutine sein, damit das Spiel nicht warten für eine Antwort auf Ihren www Anruf.

Und wenn Sie RegisterUsers von RegisterScript rufen müssen Sie StartCoroutine(client.RegisterUsers(name, pass));

verwenden, siehe Unity3d WWW documentation und Coroutine documentation

+0

Hmm? Wie beantwortet das die Frage? Ich kann damit immer noch keinen Wert zurückgeben! Du rufst am Ende nur eine Methode an !! – cregox

1

Ihre FindObjectOfType Funktion ein Null aus irgendeinem Grund zurückgibt. Warum, es ist unmöglich, nur auf den bereitgestellten Code abzuziehen.

Es ist nichtIEnumerable<string> stringcheck = client..., sondern eine Linie vor (auch wenn ich sehe, Zeilennummern auf Text versehen nicht)

+0

Was sollte ich anstelle von IEnumberable verwenden? – racingWild

+0

Nur eine Zeichenfolge - Sie geben immer 1 Zeichenfolge zurück. –

+0

@racingWild: Ich wiederhole, es geht nicht um Enumerable bu über Ihre ClientSideScript-Objektwiederherstellung (so viel wie den Code verstehen kann) – Tigran

0

ich über dieses Problem zu kommen.

1.Ich denke über die Ausgabe der Variablen in der Parameterliste.

2.So denke ich über Zeiger, aber Einheit 3d verwenden sichere C#, die keinen Zeiger hat.

3.dann denke ich über "ref" oder "out" in C#, aber eine Funktion zurück IEnumerator kann nicht "ref" oder "out" in Parameterliste in C# verwenden.

4.Finial Ich denke darüber nach, dass ich einen Zeiger selbst in sicherem C# mit generischen Sachen schreiben kann.

Hier ist meine Lösung:

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