我正在统一制作基于游览的游戏。
我想在几乎所有的类中都添加一个函数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#知识库站点上深入了解Action
和Func
委托)。编辑:由于您添加了有关非
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/