I am working on an Unity project using C# and know that WWW object would do similar thing to HTTP. WWW, however, does not provide callback function, so I create my own class which provide delegate.
using UnityEngine;
using System.Collections;
public class WebAccess : MonoBehaviour {
private WWW www;
public delegate void OnRspnReady(WebAccess webAccess); // Response ready callback
public delegate void OnRspnErr(WebAccess webAccess); // Response error callback
private void noOp(WebAccess webAccess){} // no operation
public WebAccess(){}
// create a new customised request
public void sendReq(string uri){
this.sendReq(uri, noOp, noOp);
}
public void sendReq(string uri, OnRspnReady onRspnReady){
this.sendReq(uri, onRspnReady, noOp);
}
public void sendReq(string uri, OnRspnReady onRspnReady, OnRspnErr onRspnErr){
this.www = new WWW(uri);
StartCoroutine(waitForReq(this.www, onRspnReady, onRspnErr));
// return this.www.responseHeaders.ToString();
}
// get Response content
public WWW getWWW(){
return this.www;
}
private IEnumerator waitTillDone(){
while(!this.www.isDone){}
yield return null;
}
private IEnumerator waitForReq(WWW www, OnRspnReady onRspnReady, OnRspnErr onRspnErr) {
yield return www;
// check for errors
if (www.error == null){
// Debug.Log("WWW Ok!: " + www.text);
onRspnReady(this);
} else {
// Debug.Log("WWW Error: "+ www.error);
onRspnErr(this);
}
}
}
I try it with the following code and get a positive result:
using UnityEngine;
using System.Collections;
public class Main : MonoBehaviour {
// Use this for initialization
void Start () {
WebAccess webAccess = GameObject.Find("Programs").transform.FindChild("WebAccess").GetComponent();
WebAccess.OnRspnReady fn = new WebAccess.OnRspnReady(rspnReadyCallBack);
webAccess.sendReq("http://localhost", fn);
}
private void rspnReadyCallBack(WebAccess webAccess){
Debug.Log(string.Concat("Main: ", webAccess.getWWW().text));
}
}
As I am used to program in Javascript, creating independent function, rspnReadyCallBack, is a little bit troublesome. My question is - how I create a delegate function as I would do callbacks in Javascript?
For example, this:
xmlhttp.onreadystatechange = function(){
if (xmlhttp.readyState==4 && xmlhttp.status==200){
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
}