c# - 如果场景中的多个游戏对象使用该脚本,脚本中声明的公共(public)委托(delegate)是否一定是单个实例?

标签 c# unity3d events delegates

嗯.. 要事第一。我必须让您知道,我根本不具备 C# 脚本编写方面的核心知识。

好的,这就是我的情况。 :)

假设我有一个名为 AINemy 的脚本,其中包含以下代码段:

public delegate void CallbackOnEnemyAttack(int attackDamage);
public static event CallbackOnEnemyAttack OnEnemyAttack;

我有一个 GameManager 脚本,它位于一个唯一的空游戏对象上。

情况是... AINemy 脚本附加到场景中的许多其他游戏对象。我想知道我在脚本中声明的 delegateevent 是单个实例还是每个 GameObject 附加的每个 AINemy 组件都不同。

在游戏架构方面,我有点像个怪胎,尽管我是个菜鸟。我对 Unity 中的委托(delegate)/事件非常感兴趣,以更好地设计我的脚本的体系结构,因为我真的不喜欢 Unity 如何不在检查器中公开接口(interface)的公共(public)实例,我必须以一种“hacky”的方式来通过将我的脚本转换/紧密耦合在一起来解决这个问题。

最佳答案

在 Unity 中使事件静态化的想法是,您可以轻松地订阅它而无需它的实例。 这应该在具有一个实例的脚本中使用,这意味着它必须仅附加到<​​strong>一个游戏对象

delegateevent 代码应该放在名为EventManager 或类似的脚本中。此 EventManager 脚本是附加到一个 空游戏对象的脚本。您的敌人和其他脚本可以在生成时订阅此 EvenetManager,并在有事件发生时接收通知。

What happens when you attach this multiple GameObjects and now it has multiple instances?

如果你触发和事件,你附加到游戏对象的每个脚本都会发送它们自己的事件。如果它附加到 500 个敌人并且你触发了事件,则所有 500 个敌人都会向订阅者发送一个事件。

在大多数情况下,最好将这些变量设为私有(private)并公开一个可用于订阅和触发事件的函数。

这已经完成了。 Here是来自 Unity 的 EventSystem 的完整示例,它使用 Unity 的 UnityEvent,它很慢。 Here是我制作的使用 delegate 的移植版本,应该尽可能使用。

订阅事件:

EventManager.StartListening("Spawn", SomeOtherFunction);

取消订阅事件:

EventManager.StopListening("Spawn", SomeOtherFunction);

触发事件:

EventManager.TriggerEvent("Spawn");

关于c# - 如果场景中的多个游戏对象使用该脚本,脚本中声明的公共(public)委托(delegate)是否一定是单个实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45613607/

相关文章:

c# - 对于 C# 二进制文件,匿名类的类型信息存储在哪里?

java - 当 JFrame 移动到桌面前面时会触发什么 Swing 事件

c# - 变量赋值有类型?这个叫什么?

c# - 从 ModelState 中删除 JSON.net 序列化异常

c# - Application.streamingAssetsPath 和 WebGL 构建

c# - Unity Error building Player 因为脚本有编译器错误

c# - 一次只检查一个 ListViewItem

iFrame 中加载新页面时的 jQuery 事件

c# - 在 PayPal sdk 中调用 Payment.Create 时出现服务器不可用错误

Unity 3D/2D 中的 C# : Am I required to use Classes for every script?