如何在unity3中制作全球活动?

时间:2018-02-20 17:10:16

标签: c# unity3d

我正在以团结的方式制作巡回游戏 我希望(几乎)我的所有课程都有一个功能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#的新手,但我有其他语言的经验。

2 个答案:

答案 0 :(得分:2)

只需使用简单的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
    }
}

答案 1 :(得分:1)

你可以简单地创建一个名为onNextRound的类,然后在其中删除star()并更新函数并创建onNextRound()然后编写你的函数。让它公开

现在将此脚本附加到您的主相机。

最后,你可以在你需要的任何类中创建和实现这个类,并调用该函数