我可以通过方法传递事件吗?

时间:2014-04-13 11:42:34

标签: c# unity3d

我试图让我的GetStringFromServer方法更抽象,因为我不想为我对服务器的所有不同调用创建相同的方法,结果总是一样的;无论如何都是一个json字符串。

    public delegate void GoogleServerResponse(string result);
    public static event GoogleServerResponse OnGoogleServerResponse;

    void Start () {

        print ("going to google...");

        StartCoroutine( GetStringFromServer("http://google.com", OnGoogleServerResponse) );
    }

    IEnumerator GetStringFromServer(string url, Event e) {

        WWW www = new WWW(url);

        yield return www;

        if( e != null )
            e (www.text);
    }

我想这可以通过URL触发传入的事件,使我能够收听事件,并为我的网络服务器(不是google ofc,但通常" / getplayer"," / createnewgame"等等。)

2 个答案:

答案 0 :(得分:1)

只有当您尝试传递另一个类的事件(课外)时,您才能通过事件这一事实才适用。

如果您尝试从定义事件的类中传递事件,则无人阻止您这样做。

例如,以下内容适用于我。

public delegate void GoogleServerResponse(string result);

public class PassEvent
{
    public static event GoogleServerResponse OnGoogleServerResponse;

    private void Start()
    {
        print("going to google...");
        StartCoroutine(GetStringFromServer("http://google.com", OnGoogleServerResponse));
    }

    private void print(string p)
    {

    }

    private void StartCoroutine(IEnumerator enumerator)
    {

    }

    private IEnumerator GetStringFromServer(string url, GoogleServerResponse myEvent)
    {
        Uri www = new Uri(url);

        yield return www;

        if (myEvent != null)
        {
            myEvent(www.text);
        }
    }
}

附注:避免使用" On"命名事件。前缀,调用事件的辅助方法应使用[On]EventName命名约定命名。

答案 1 :(得分:0)

您无法传递Event,您应该尝试(代理/包装) Action

IEnumerator GetStringFromServer(string url, Action<string> e) {

    WWW www = new WWW(url);

    yield return www;

    if( e != null )
        e (www.text);
}

并称之为:

StartCoroutine( GetStringFromServer("http://google.com", (param) => {
    if(OnGoogleServerResponse != null)
        OnGoogleServerResponse(param);
}));