我正在统一制作基于游览的游戏。
我想在几乎所有的类中都添加一个函数OnNextRound
 当用户单击“下一轮”按钮时,将调用该按钮。

void OnGUI() {
    // ...

    if (GUI.Button(new Rect(10f, Screen.height - 40, 100, 30), "next round")) {
        // here call all OnNextRound functions
    }
}


也必须包含此OnNextRound函数的某些类没有扩展MonoBehaviour

public class SomeClass {
    // some vars and functions here
}


并通过这种方式实例化:

SomeClass sc = new SomeClass(/* some params */);


这些类还必须包含OnNextRound函数。

因此,我想在每个类的每个实例中调用所有名为OnNextRound的函数。

如何做到这一点,或者不可能以这种方式做到这一点?如果不可能,那么我如何达到类似的效果?

我是C#的新手,但是我有其他语言的经验。

最佳答案

只需使用简单的event

using UnityEngine;
using System;

public class EventExample : MonoBehaviour {

    public static event Action myEvent;

    void OnGUI() {
        if (GUI.Button(new Rect(10f, Screen.height - 40, 100, 30), "next round")) {
            myEvent();
        }
    }
}


然后,在要调用OnNextRound()方法的所有脚本中,添加以下行:

private void Awake() {
    EventExample.myEvent += OnNextRound;
}

private void OnNextRound() {
    //Do your stuff
}


无论如何,有两句话:


不要使用OnGUI,请使用UI按钮
event的签名必须与OnNextRound方法的签名匹配。例如,如果您的方法需要一个string参数,则该事件应声明为Action<string>。如果您的方法具有返回类型,则应使用Func而不是Action(您可以在Microsoft C#知识库站点上深入了解ActionFunc委托)。


编辑:由于您添加了有关非MonoBehaviour类的内容,因此可以将您的方法注册到该类的构造函数中的EventExample.myEvent,即:

public class SomeClass {

    public SomeClass () {
        EventExample.myEvent += OnNextRound;
    }

    private void OnNextRound() {
        //Do stuff
    }
}

关于c# - 如何在unity3中进行全局事件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48890655/

10-08 20:34