如果场景中的多个游戏对象使用该脚本,则脚本中声明的公共委托是否确定为单个实例?



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

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

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

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

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

案情是...AIEnemy脚本附加到场景中的许多其他游戏对象。我想知道我在脚本中声明的委托和事件是单个实例,还是附加到每个游戏对象的每个 AIEnemy 组件会有所不同。

在游戏架构方面,我是一个整洁的怪胎,尽管我是一个菜鸟。我对 Unity 中的委托/事件非常感兴趣,以便更好地设计脚本的架构,因为我真的不喜欢 Unity 如何在检查器中不公开接口的公共实例,我必须通过强制转换/紧密耦合我的脚本来采取"黑客"的方式来绕过它。

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

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

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

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

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

这已经完成了。下面是一个完整的 UnityEventSystem示例,它使用 Unity 的UnityEvent很慢。这是我制作的移植版本,它使用delegate,如果可能的话应该使用。

订阅活动:

EventManager.StartListening("Spawn", SomeOtherFunction);

取消订阅活动:

EventManager.StopListening("Spawn", SomeOtherFunction);

触发事件:

EventManager.TriggerEvent("Spawn");

最新更新