【问题标题】:Delegates, events, actions on multiple scripts [duplicate]多个脚本上的代表、事件、操作[重复]
【发布时间】:2020-11-22 19:29:46
【问题描述】:

这是我的问题:

我有一个脚本(统一,c#),在多个对象中实例化,应该将消息发送到一个唯一的对象。例如:

public delegate void DeathDelegate(string name, float q)
public event DeathDelegate OnDeathEvent;

但是当一个实例化的对象(使用相同的脚本)尝试发送消息时会出现错误

NullReferenceException: Object reference not set to an instance of an object

我知道在多个实例化对象上使用委托是不可能做到这一点的,但我可以理解如何以其他方式实现这一点。 任何帮助,将不胜感激!谢谢!!

【问题讨论】:

  • 只是一个小注解:On* 名称用于事件不是标准的。事件应该是Click。引发事件的对象上的方法通常称为OnClick
  • 看起来你有一个多对一的关系,任何调用者对象都应该通知唯一的监听器。您可以尝试将事件设为静态,以便侦听器处于类级别,而不是对象级别。
  • @Everts 我该怎么做?
  • @Everts - 静态事件对我来说是个坏主意。
  • 在这种情况下,发送事件的不是哪个对象,而是该类型的任何对象。所以静态政变是一种可行的方法。如果有任何理由不使用,也可以不使用。

标签: c# unity3d delegates


【解决方案1】:

您可能错过了委托给您的任务;

public delegate void DeathDelegate(string name, float q);
public event DeathDelegate OnDeathEvent;

void Start()
{
     OnDeathEvent += (name, q) => Debug.Log("It works now?"); //Missing line
}

你的调用不应该依赖调用委托作为方法,因为你有时注意到,它可以引用一个空值。您需要检查 OnDeathEvent 是否不为空。

OnDeathEvent?.Invoke("test", 1f);
// or an equivalent
if(OnDeathEvent != null)
{
    OnDeathEvent("test", 1f);
}

PS:你可以向唯一的对象发送消息,你需要先修复你的错误

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多