2012-01-21 12 views
17

これはUnity3dのC#質問です。目的は、私がURLを渡して、GETでデータを受け取るようなオブジェクトを作成することです。オブジェクトはWWWロジックのラッパーになります。私はポストの引数としてキーと値のペアのURLと 'Dictionary'を提供することもできる 'POST'オブジェクトも好きです。私はWWWオブジェクトを使用し、これを試してみて、達成するためにユニティGET/POSTラッパー

get_data = GET.request("http://www.someurl.com/somefile.php?somevariable=somevalue"); 

post_data = POST.request("http://www.someurl.com/somefile.php", post) 
// Where post is a Dictionary of key-value pairs of my post arguments. 

:すっごく...私たちは最終的にこのような何かをしたいと思います。さて、WWWオブジェクトのダウンロード時間を与えるには、MonoBehaviourオブジェクト内でこれを実行し、結果をyieldにする必要があります。だから私はこれ、どの作品だ:

public class main : MonoBehavior 
{ 
    IEnumerator Start() 
    { 
     WWW www = new WWW("http://www.someurl.com/blah.php?action=awesome_stuff"); 
     yield return www; 
     Debug.Log(www.text); 
    } 
} 

を私が本当にしたいことは、このされています。今、私は(ルートと呼ばれる)階層内の単一GameObjectに添付メインスクリプトを持って

public class main : MonoBehavior 
{ 
    IEnumerator Start() 
    { 
     GET request = new GET("http://www.someurl.com/blah.php?action=awesome_stuff"); 
     Debug.Log(request.get_data()); // Where get_data() returns the data (which will be text) from the request. 
    } 
} 

GETスクリプトをルートGameObjectにも添付する必要がありますか? mainから動的に対応できますか?

最終的には、GETPOSTリクエストを簡単に送信できるソリューションが必要です。

乾杯!

答えて

17

ああ、見つかりました!

私の問題は、MonoBehaviourとCoroutinesがどのように働いたのかという誤解でした。解決策は非常に簡単です。

エディタで、空のGameObjectを作成します。私はそれをDBと名づけた。

using System; 
using UnityEngine; 
using System.Collections; 
using System.Collections.Generic; 
class DB : MonoBehaviour 
{ 
    void Start() { } 

    public WWW GET(string url) 
    { 
     WWW www = new WWW(url); 
     StartCoroutine(WaitForRequest(www)); 
     return www; 
    } 

    public WWW POST(string url, Dictionary<string, string> post) 
    { 
     WWWForm form = new WWWForm(); 
     foreach (KeyValuePair<String, String> post_arg in post) 
     { 
      form.AddField(post_arg.Key, post_arg.Value); 
     } 
     WWW www = new WWW(url, form); 

     StartCoroutine(WaitForRequest(www)); 
     return www; 
    } 

    private IEnumerator WaitForRequest(WWW www) 
    { 
     yield return www; 

     // check for errors 
     if (www.error == null) 
     { 
      Debug.Log("WWW Ok!: " + www.text); 
     } 
     else 
     { 
      Debug.Log("WWW Error: " + www.error); 
     } 
    } 
} 

次に、メインスクリプトの開始機能でこれを行うことができます。

private DB db; 
void Start() 
{ 
    db = GameObject.Find("DB").GetComponentInChildren<DB>(); 
    results = db.GET("http://www.somesite.com/someAPI.php?someaction=AWESOME"); 
    Debug.Log(results.text); 
} 

POSTリクエストはテストされていませんが、すべてのロジックがラップされました。あなたの心の欲望、歓声にHTTPリクエストを送信!

+1

大きな問題FINDメソッドを使用すると、あなたのゲームのパフォーマンスに大きな打撃を与えます....ゲームオブジェクトを見つけようとしています....デリゲートhttp:// www .unifycommunity.com/wiki/index.php?title = CSharpMessenger_Extended –

+0

絶対に正しい。理想的には、参照変数を介してオブジェクトを追跡し、その上にぶら下がって一度だけ行う必要があります。 シーン内のゲームオブジェクトがこのラッパーを使用している場合は、UnityエディタでDB GOを割り当てることができるpublic varを持つことができます。 – PandemoniumSyndicate

+2

私はこれが実際に動作するとは思わない。 実行中: StartCoroutine(WaitForRequest(request)) Debug.Log(request.text) 要求がまだ行われていない場合は、実際の機能ではなくコルーチンが停止します。要求が完了する前にどのDebug.Log(request.text)が呼び出されるか。 –

2

あなたが参照しているGETスクリプトとは何ですか? WWWクラスでは、GETデータをうまく取り出すことができます。必要な情報は、インスタンス化されたWWWオブジェクトのtextプロパティにあります。ここではドキュメントがあります:

http://unity3d.com/support/documentation/ScriptReference/WWW-text.html http://unity3d.com/support/documentation/ScriptReference/WWW.html

あなたが今やっているようあなたがする必要があるのは、WWWオブジェクトを得ています、あなたが興味を持っているプロパティを、単純でシンプルに、余分なクラスを必要とせずに読んでください。

要するにhttp://unity3d.com/support/documentation/ScriptReference/WWWForm.html

が、あなたは単に、その後、WWWFormオブジェクトを作成しなaddField()を介して、それにフィールドを追加し、:POSTオブジェクトを送信するよう

は、それがWWWFormクラスは何のためにあるのかですPOST URL &を元のオブジェクトとする新しいWWWオブジェクトを作成します。 WWWオブジェクトを生成し、戻ってくるとデータが送信されます。レスポンスは、対応するフィールドのテキストプロパティ&のエラーです。プレーン、クリーン&シンプルです。

HTH!

+0

申し訳ありませんが、GETオブジェクトは、WWWのロジックをラップするクラスです。私が必要とするすべての利点は、URLを入力して出力を受け取ることだけです。しかし、どのようにユニティが機能するかを考えれば、それが可能かどうかはわかりません。私は私の質問を編集します。 – PandemoniumSyndicate

0

@ pandemoniumsyndicateのコードを修正してコールバックを追加しました。コルーチンを呼び出した直後にGETPOST関数が終了するため、元のコードは完全には正しくありません。その時点では、WWWリクエストはまだ完了しておらず、(www.isDone)以外のフィールドへのアクセスは無意味です。

次のコードでは、リクエストの結果が完了し、受信したデータがある場合に呼び出されるデリゲートWWWRequestFinishedを定義しています。

using System; 
using UnityEngine; 
using System.Collections; 
using System.Collections.Generic; 

public class WWWRequestor : MonoBehaviour 
{ 

    Dictionary<WWW, object> mRequestData = new Dictionary<WWW, object>(); 
    public delegate void WWWRequestFinished(string pSuccess, string pData); 

    void Start() { } 

    public WWW GET(string url, WWWRequestFinished pDelegate) 
    { 
     WWW aWww = new WWW(url); 
     mRequestData[aWww] = pDelegate; 

     StartCoroutine(WaitForRequest(aWww)); 
     return aWww; 
    } 

    public WWW POST(string url, Dictionary<string, string> post, WWWRequestFinished pDelegate) 
    { 
     WWWForm aForm = new WWWForm(); 
     foreach (KeyValuePair<String, String> post_arg in post) 
     { 
      aForm.AddField(post_arg.Key, post_arg.Value); 
     } 
     WWW aWww = new WWW(url, aForm); 

     mRequestData[aWww] = pDelegate; 
     StartCoroutine(WaitForRequest(aWww)); 
     return aWww; 
    } 

    private IEnumerator WaitForRequest(WWW pWww) 
    { 
     yield return pWww; 

     // check for errors 
     string aSuccess = "success"; 
     if (pWww.error != null) 
     { 
      aSuccess = pWww.error; 
     } 

     WWWRequestFinished aDelegate = (WWWRequestFinished) mRequestData[pWww]; 
     aDelegate(aSuccess, pWww.text); 
     mRequestData.Remove(pWww); 
    } 

}