我正在创建一个团结的多人游戏系统,针对那些不想用网络搞乱任何事情的人。
为了简化它,我想创建通用函数(由于缺乏更好的名称),例如 Start() 或 Update() ,它们可以由另一个脚本调用,而无需引用父脚本。
我可以使用Unity的事件系统,但这需要该函数的用户添加对通用函数的订阅(我不想要这个)。
另一种方法是在每个脚本中搜索该函数,但这有一些问题,例如函数需要公开,在运行时将脚本添加到游戏对象时需要一些复杂的系统,而且有点粗略。
我的目标是能够在任何脚本中放置像“ClientDisconnected()”这样的函数,并且无需任何额外的行或引用即可调用它。
Unity 的 Monobehaviour 类不实现
Awake
、Start
和 Update
等方法,而是在加载新 Monobehaviour 类时搜索并存储它们。目前尚不清楚 Unity 到底是如何做到这一点的,但您可以在这里了解更多信息。
关于您想要的功能,有几种可能的方法可以实现。最直接的解决方案可能是使用 C# 反射。但是,您仍然需要一些指导来了解在寻找“通用”方法时要查看哪些类。 Unity 仅通过查看 Monobehaviour 类来解决此问题。因此,
Awake
、Start
和Update
方法只能像派生 Monobehaviour 类的类中的“通用”方法一样工作。最简单的可能是为此创建您自己的基类。但是,在这种情况下,您也可以简单地创建一个 virtual
或 abstract
方法,要求用户在方法名称前添加关键字 override
。有点不太优雅,但在许多情况下是一个完美的解决方案(从好的方面来说,这将使该方法显示在 IDE 中,而不是使用 C# 反射时)。
我希望这能回答您的问题。