【问题标题】:Are public delegates declared in a Script sure to be of single instance if multiple GameObjects in the Scene use that Script?如果场景中的多个游戏对象使用该脚本,那么在脚本中声明的公共委托是否肯定是单个实例?
【发布时间】:2017-08-10 12:21:49
【问题描述】:

嗯.. 第一件事是第一。我必须让你知道,我根本没有 C# 脚本的核心知识。

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

假设我有一个名为 AIEnemy 的脚本,带有这个 sn-p:

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

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

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

虽然我是菜鸟,但在游戏架构方面我还是个怪人。我对 Unity 中的委托/事件非常感兴趣,以便更好地设计我的脚本架构,因为我真的不喜欢 Unity 如何在 Inspector 中公开接口的公共实例,我必须采取一种“hacky”的方式来通过将我的脚本强制/紧密耦合在一起来解决它。

【问题讨论】:

  • 只要这些不是静态回调,它们在每个实例中都是不同的。
  • 谢谢,猎头 :) 我不确定,因为我不能将我的代表声明为静态。知道为什么吗?
  • 这主要是因为代表是什么,stackoverflow.com/questions/6835766/…

标签: c# unity3d events delegates


【解决方案1】:

在 Unity 中将事件设为静态的想法是,您无需实例即可轻松订阅它。 这应该在具有一个实例的脚本中使用,这意味着它必须附加到一个仅限游戏对象

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

当你附加这个多个游戏对象并且现在它有时会发生什么 多个实例?

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

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

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

订阅事件:

EventManager.StartListening("Spawn", SomeOtherFunction);

取消订阅事件:

EventManager.StopListening("Spawn", SomeOtherFunction);

触发事件:

EventManager.TriggerEvent("Spawn");

【讨论】:

  • 哦,哦!非常感谢您的回答和示例代码。我会这样做并应用类似于 EventManager 的东西。 :)
  • 不客气。如果需要,您还可以使 delegateGameObject 作为参数,您可以使用它来确定哪个对象发送了该事件。虽然,它仍然会被多次调用,所以我建议你在我的回答中坚持使用 EventManager,它使用 Dictionary 来运行。编码愉快!
  • Uguuuu,再次感谢。祝福你! :) 是的,我会坚持使用 EventManager 并在需要时优化代码。 :3
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-24
  • 1970-01-01
  • 1970-01-01
  • 2017-03-10
  • 2018-07-30
相关资源
最近更新 更多