2012-04-13 19 views
1

私はC#と私は通常Javaを開発し、IEnumeratorを使って値を返すのに問題があります。基本的に私は、サーバー上のデータベースにユーザー名とパスワードを登録するクライアント側のスクリプトを持っています。私の問題は、ボタンをクリックすると、クライアントサイドスクリプトのメソッドを呼び出して、ユーザー名とパスワードの入力をデータベースに追加する必要があるということです。これを処理するメソッドは、登録が成功/失敗であったことを示す文字列を返す必要があります。私はこれを実装しようとすると、私は次のエラーを取得する:値を返すIEnumerator

」とNullReferenceException: UnityEngine:オブジェクト(23資産/スクリプト/ RegisterScript.csで) RegisterScript.OnMouseUp()のインスタンスに設定されていないオブジェクト参照を。 SendMouseEvents:DoSendMouseEvents() "

以下は2人のクラスのコードです。クライアント側のスクリプトにユーザー名とパスワードを渡すボタンに付加

クライアント側のスクリプト

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

は、ここに私のソリューションです。 –

+0

関連、より良い解決法imho:http://answers.unity3d.com/questions/207733/can-coroutines-return-a-value.html – cregox

答えて

0

FindObjectOfTypeに(nullを返しますあなたのケースClientSideScript)をあなたのunity3dシーンに追加します。

あなたはまた、ゲームが待っていないので、ユニティコルーチンする必要があるとして、それはIEnumerator戻り値の型を持っているこの

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) 

}

ような何かにあなたのRegisterUsers方法を変更する必要がありますあなたのwwwコールへの応答。

そして、あなたはRegisterScriptからRegisterUsersを呼び出すときにStartCoroutine(client.RegisterUsers(name, pass));

を使用する必要がUnity3d WWW documentationCoroutine documentation

+0

Hmm?これはどのように質問に答えるのですか?私はまだこれで値を返すことはできません!あなたは最後にメソッドを呼び出すだけです! – cregox

1

はあなたのFindObjectOfType機能が何らかの理由でnullを返します。 なぜ、提供されたコードだけを見ても差し支えありません。

それはないIEnumerable<string> stringcheck = client...だが、YOUTは、そのタイプのGameObjectを持っていない場合は(私は提供されたテキストに行番号が表示されていない場合でも)の前の行は

+0

IEnumberableの代わりに何を使用すればよいですか? – racingWild

+0

単なる文字列です。常に1文字列を返します。 –

+0

@racingWild:これは、ClientSideScriptオブジェクトの回復に関するEnumerable buではありません(提供されたコードを理解できる程度) – Tigran

0

は私もこの問題に遭遇してご覧ください。

1.出力変数をパラメータリストに入れると思います。

2.私はポインタを考えていますが、ポインタを持っていない3d use safe c#です。

3.私はC#で "ref"または "out"と思っていますが、関数の戻り値IEnumeratorはC#のパラメータリストで "ref"または "out"を使用できません。

4.Finial私は安全なC#で汎用のものでポインタを書くことができると思います。私はIEnumerableをすることができ何を参照してくださいいけない、この上位コードから

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