C# 多个脚本上的委托、事件和操作

C# 多个脚本上的委托、事件和操作,c#,unity3d,delegates,C#,Unity3d,Delegates,我的问题是: 我有一个脚本(unity,c#),在多个对象中实例化,它应该向一个唯一的对象发送消息。例如: public delegate void DeathDelegate(string name, float q) public event DeathDelegate OnDeathEvent; 但是,当实例化对象(使用相同的脚本)尝试发送消息时,会出现错误 NullReferenceException: Object reference not set to an instance o

我的问题是:

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

public delegate void DeathDelegate(string name, float q)
public event DeathDelegate OnDeathEvent;
但是,当实例化对象(使用相同的脚本)尝试发送消息时,会出现错误

NullReferenceException: Object reference not set to an instance of an object
我明白,在多个实例化对象上使用委托是不可能做到这一点的,但我可以理解如何以其他方式实现这一点。
任何帮助都将不胜感激!谢谢

您可能缺少对该代表的分配

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

void Start()
{
     OnDeathEvent += (name, q) => Debug.Log("It works now?"); //Missing line
}
您的调用不应该依赖于将委托作为方法调用,因为正如您有时注意到的,它可以引用null。您需要检查OnDeathEvent是否不为null

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

PS:您可以将消息发送到唯一的对象,您需要首先修复错误

只是一个小小的旁注:事件的
On*
名称的使用不是标准的。事件应
单击
。引发事件的对象上的方法通常称为
OnClick
。看起来您有一个多对一关系,其中任何调用方对象都应该通知唯一的侦听器。您可以尝试将事件设置为静态,使侦听器处于类级别,而不是对象级别。@Everts我如何才能做到这一点?@Everts-静态事件对我来说听起来是个坏主意。在这种情况下,问题不在于哪个对象发送事件,而在于任何类型的对象。所以,静态政变是一种方式去。如果有任何不使用的理由,可以不使用。