2012-01-21 17 views
17

यह सी # प्रश्न में एक यूनिटी 3 डी है। लक्ष्य एक ऑब्जेक्ट बनाना है जैसे कि मैं एक यूआरएल में पास कर सकता हूं और GET के माध्यम से डेटा प्राप्त कर सकता हूं, एक ऑब्जेक्ट जो मैं बनाऊंगा वह डब्ल्यूडब्ल्यूडब्ल्यू तर्क के लिए एक रैपर होगा। मुझे एक 'पोस्ट' ऑब्जेक्ट भी पसंद आएगा, जहां मैं पोस्ट बहस के रूप में एक यूआरएल और कुंजी-मूल्य जोड़े के 'शब्दकोश' की आपूर्ति कर सकता हूं। Sooo ... हम अंततः कुछ इस तरह करना चाहते हैं:यूनिटी जीईटी/पोस्ट रैपर

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 वस्तु का उपयोग करें। अब, डाउनलोड करने के लिए 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); 
    } 
} 

यह क्या मैं वास्तव में चाहते हैं:

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

अब मैं मुख्य एकल GameObject पदानुक्रम (बुलाया रूट) में से जुड़ी स्क्रिप्ट है। क्या मुझे रूट GameObject रूट से जुड़े GET स्क्रिप्ट की आवश्यकता है? क्या मैं गतिशील रूप से main से कर सकता हूं?

आखिरकार, मुझे एक समाधान की आवश्यकता है जो मुझे GET और POST अनुरोधों को आसानी से भेजने की अनुमति देता है।

चीयर्स!

उत्तर

17

आह, समझ गया!

मेरी समस्या एक गलतफहमी थी कि कैसे MonoBehaviour और Coroutines काम किया। समाधान बहुत आसान है।

संपादक में, एक खाली गेम ऑब्जेक्ट बनाएं। मैंने इसे डीबी नाम दिया।फिर निम्न स्क्रिप्ट को इसमें संलग्न करें:

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/विकी/index.php? शीर्षक = CSharpMessenger_Extended –

+0

बिल्कुल सही। आदर्श रूप में आप संदर्भ चर के माध्यम से ऑब्जेक्ट का ट्रैक रखेंगे, और उस पर लटकेंगे ताकि आपको केवल एक बार ऐसा करने की आवश्यकता हो। या अगर दृश्य में एक gameobject इस आवरण उपयोग कर रहा है, आप एक सार्वजनिक वर जो एकता संपादक में डीबी GO सौंपा जा सकता है हो सकता है, तो आप कुछ भी नहीं मिल की जरूरत है! – PandemoniumSyndicate

+2

मुझे नहीं लगता कि यह वास्तव में काम करता है। जब आप कर रहे हैं: स्टार्टकोराउटिन (WaitForRequest (अनुरोध)) डीबग.लॉग (request.text) यदि अनुरोध नहीं किया गया है तो अभी तक कोरआउट को रोक दिया जाएगा, वास्तविक कार्य नहीं। अनुरोध समाप्त होने से पहले कौन सा Debug.Log (request.text) कॉल किया जाएगा। –

2

वह जीईटी स्क्रिप्ट क्या है जिसका आप उल्लेख कर रहे हैं? डब्ल्यूडब्ल्यूडब्ल्यू वर्ग आपको जीईटी डेटा को ठीक से पुनः प्राप्त करने की अनुमति देता है, आपको जो जानकारी चाहिए वह तत्काल डब्ल्यूडब्ल्यूडब्ल्यू ऑब्जेक्ट की टेक्स्ट प्रॉपर्टी में है। यहाँ प्रलेखन है:

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() के माध्यम से इसे करने के लिए फ़ील्ड जोड़ने, और फिर:

एक पोस्ट वस्तु भेजने का सवाल है, कि क्या WWWForm वर्ग के लिए है POST URL & पूर्व ऑब्जेक्ट के साथ एक नया WWW ऑब्जेक्ट बनाएं, यही वह है। WWW ऑब्जेक्ट को उधार दें और एक बार यह वापस आने के बाद आप डेटा जमा कर दिए गए हैं। प्रतिक्रियाएं, फिर से, पाठ क्षेत्र & संबंधित फ़ील्ड में त्रुटियों में हैं। सादा, साफ & सरल।

एचटीएच!

+0

क्षमा करें, GET ऑब्जेक्ट वह वर्ग है जो WWW के तर्क को लपेटता है। मुझे जो लाभ करना है, वह एक यूआरएल आपूर्ति करना और आउटपुट प्राप्त करना होगा। मुझे यकीन नहीं है कि यह संभव है कि एकता कैसे काम करती है। मैं अपना प्रश्न संपादित करूंगा। – PandemoniumSyndicate

0

यहां कॉलबैक जोड़ने के लिए @ pandemoniumsyndicate कोड संशोधित है। मूल कोड पूरी तरह से सही नहीं है, क्योंकि GET और POST फ़ंक्शन कोरआउटिन को कॉल करने के तुरंत बाद बाहर निकल जाएंगे। उस समय यह संभावना है कि 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); 
    } 

} 
संबंधित मुद्दे