1

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

「 NullReferenceException: オブジェクト参照がオブジェクト RegisterScript.OnMouseUp () のインスタンスに設定されていません (Assets/Scripts/RegisterScript.cs:23 で) UnityEngine.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);
    }   
  }
4

3 に答える 3

1

あなたのFindObjectOfType関数は何らかの理由で null を返します。なぜ、提供されたコードだけを見て差し引くことは不可能です。

ではなく 、1行前です(提供されたテキストに行番号が表示されIEnumerable<string> stringcheck = client...ていなくても)

于 2012-04-13T12:28:56.377 に答える
1

FindObjectOfTypeunity3d シーンGameObjectにそのタイプ (あなたの場合)がない場合は null を返します。ClientSideScript

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 呼び出しへの応答を待たないように、ユニティ コルーチンである必要があるため、戻り値の型があります。

そして、あなたが呼び出すときはRegisterUsersRegisterScript使用する必要がありますStartCoroutine(client.RegisterUsers(name, pass));

Unity3d WWW のドキュメントコルーチンのドキュメントを参照してください。

于 2012-04-13T15:07:26.243 に答える
0

私もこの問題に遭遇します。

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

2.だから私はポインターについて考えますが、unity 3dはポインターを持たない安全なc#を使用します。

3.次に、C#で「ref」または「out」について考えますが、関数リターンIEnumeratorは、C#のパラメーターリストで「ref」または「out」を使用できません。

4.Final 私は、一般的なものを使用して、安全な 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;
  }
于 2014-03-19T13:53:08.210 に答える