我正在以团结的方式制作巡回游戏
我希望(几乎)我的所有课程都有一个功能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#的新手,但我有其他语言的经验。
答案 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#知识库网站上深入了解Action
和Func
个代理)。编辑:由于你添加了关于非MonoBehaviour
类的位,你可以将你的方法注册到类的构造函数中的EventExample.myEvent
,即:
public class SomeClass {
public SomeClass () {
EventExample.myEvent += OnNextRound;
}
private void OnNextRound() {
//Do stuff
}
}
答案 1 :(得分:1)
你可以简单地创建一个名为onNextRound的类,然后在其中删除star()并更新函数并创建onNextRound()然后编写你的函数。让它公开
现在将此脚本附加到您的主相机。
最后,你可以在你需要的任何类中创建和实现这个类,并调用该函数