2017-08-10 37 views
1

嗯..第一件事是第一件事。我必须让你知道,我根本没有C#脚本的核心知识。如果场景中的多个GameObjects使用该脚本,是否在脚本中声明了公共代理?

好吧,所以这是我的情况。 :)

比方说,我有一个剧本叫AIEnemy在这个片段:

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

而且我有一个游戏管理器的脚本在一个和唯一的空游戏物体旁边。

案例是...... AIEnemy脚本附加到场景中的许多其他GameObjects。我还想知道,在脚本中声明的代表事件是单个实例还是每个附加到每个GameObject的AIEnemy组件都不相同。

即使我是一个noob,即使是游戏架构,我也是一个整洁的怪胎。我对Unity中的代表/事件超级感兴趣,因为我更好地设计我的脚本的体系结构,因为我真的不喜欢Unity如何在Inspector中公开接口的公共实例,因此我不得不采取“黑客”通过铸造/紧密结合我的脚本来解决它。

+1

他们每个实例都不相同。 –

+0

谢谢,猎头:)我不确定那个寿,因为我无法将我的代表声明为静态。任何想法为什么? – Zarashi99

+1

这主要是因为代表是什么,https://stackoverflow.com/questions/6835766/why-can-a-net-delegate-not-be-declared-static#6835822 < - 这个答案给出了一个更好的解释。 –

回答

3

在Unity中制作静态事件的想法是,您可以轻松订阅而不需要它的实例。 这应该在一个脚本中使用一个实例,这意味着它必须连接到一个游戏对象只有

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

当你附加这个多个GameObjects,现在它有多个实例 会发生什么?

如果触发事件,则附加到GameObject的每个脚本都将发送自己的事件。如果这附属于500个敌人并触发事件,则所有500个敌人将向该用户发送一个事件。

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

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

订阅的事件:

EventManager.StartListening("Spawn", SomeOtherFunction); 

取消订阅的事件:

EventManager.StopListening("Spawn", SomeOtherFunction); 

触发事件:只要这些都不是静态的回调

EventManager.TriggerEvent("Spawn"); 
+1

哦,哦!非常感谢你的答案和示例代码。我会这样做,并应用像EventManager一样的东西。 :) – Zarashi99

+1

不客气。如果你愿意,你也可以让'delegate'把'GameObject'作为参数,你可以用它来确定哪个对象发送了这个事件。虽然,它仍然会被调用很多次,所以我建议你在使用'Dictionary'运行的答案中使用EventManager。快乐的编码! – Programmer

+1

Uguuuu,再次感谢。祝福youuuu! :)是的,我会坚持使用EventManager,并在需要时优化代码。 :3 – Zarashi99