C# 我可以只参加没有委托的活动吗?

C# 我可以只参加没有委托的活动吗?,c#,unity3d,events,delegates,C#,Unity3d,Events,Delegates,我有一个“射击”项目的球员。如果玩家开枪,我会手动触发事件。另一个游戏对象有一个脚本,如果侦听器和事件被触发,侦听器将执行特定的方法。我是新手。我真的不需要授权,只需要事件。我在网上自学编程,但到处都是如何仅与代表一起使用事件 我可以只拥有不带委托的事件吗?如果是,如何像这样声明事件?我相信从技术上讲,您可以拥有不带委托的事件,如中所述 但是,代理用于从引发事件的位置传递信息。没有它,程序就不知道从哪里调用事件以及传递什么信息 这是一个很好的例子,有很多这样的例子,以帮助利基案件。现在,如果您是

我有一个“射击”项目的球员。如果玩家开枪,我会手动触发事件。另一个游戏对象有一个脚本,如果侦听器和事件被触发,侦听器将执行特定的方法。我是新手。我真的不需要授权,只需要事件。我在网上自学编程,但到处都是如何仅与代表一起使用事件

我可以只拥有不带委托的事件吗?如果是,如何像这样声明事件?

我相信从技术上讲,您可以拥有不带委托的事件,如中所述

但是,代理用于从引发事件的位置传递信息。没有它,程序就不知道从哪里调用事件以及传递什么信息

这是一个很好的例子,有很多这样的例子,以帮助利基案件。现在,如果您是自学编程,我建议您先学习模式并使其工作,然后再考虑为什么代理和事件总是成对出现

public delegate void ShootEventHandler(object sender, ShootEventArgs e);
public class ShootEventArgs
{
    public ShootEventArgs(string s) { Text = s; }
    public String Text {get; private set;} // readonly
}
在sender中传递
,然后重新创建您创建的代理,这是命令。在你想叫射击的地方,你会有这样的东西

var handler = this.Shoot; // Get the event you want to fire
handler?.Invoke(this, new ShootEventArgs("Bang")); // tell eveything interested "Bang"
对射击事件感兴趣的游戏对象可以订阅以下信息:

this.Player.Shoot += this.ShootHandler;
public void ShootHandler(object sender, ShootEventArgs e) // common to use e for event args
{
    Console.WriteLine(e.Text); // print "Bang"
}
我相信,从技术上讲,您可以在没有代表的情况下举办活动,如中所述

但是,代理用于从引发事件的位置传递信息。没有它,程序就不知道从哪里调用事件以及传递什么信息

这是一个很好的例子,有很多这样的例子,以帮助利基案件。现在,如果您是自学编程,我建议您先学习模式并使其工作,然后再考虑为什么代理和事件总是成对出现

public delegate void ShootEventHandler(object sender, ShootEventArgs e);
public class ShootEventArgs
{
    public ShootEventArgs(string s) { Text = s; }
    public String Text {get; private set;} // readonly
}
在sender中传递
,然后重新创建您创建的代理,这是命令。在你想叫射击的地方,你会有这样的东西

var handler = this.Shoot; // Get the event you want to fire
handler?.Invoke(this, new ShootEventArgs("Bang")); // tell eveything interested "Bang"
对射击事件感兴趣的游戏对象可以订阅以下信息:

this.Player.Shoot += this.ShootHandler;
public void ShootHandler(object sender, ShootEventArgs e) // common to use e for event args
{
    Console.WriteLine(e.Text); // print "Bang"
}

事件是具有安全约束的委托

  • 只能从保存事件的类中调用该事件
  • 只能从类外部注册/注销事件(仅+=/-=)
  • 不能将事件作为参数传递
  • 您只能从保存事件的类(eventName=null)中清除事件
离题:UnityEvent不是真正的事件,它是一个包含委托(操作)列表的类

调用事件(或委托)时,应始终检查空值,因为您永远不知道引用是否指向对象。UnityEvent不需要这个,因为正如我提到的,它不是真实事件,如果集合为空,则不会发生任何事情

public delegate void MyDel();
// The two following behaves the same
public MyDel myDel;
public Action myAction;

public event Action myEvent;

void Start(){
     if(myAction != null){ myAction(); }
     if(myEvent != null) { myEvent(); }
     if(myEvent != null) { myEvent.Invoke(); }
}
这些都是相同的事情,但选择一个还是另一个取决于你想做什么

在另一个类中考虑以下内容:

void Start(){
    refToClass.myAction = MyMethod;
    refToClass.myEvent += MyMethod;
}
void MyMethod(){}
第一种情况将删除附加到委托的所有方法,然后MyMethod是唯一剩下的侦听方法。
事件将不允许这样做,只允许+=/-=这样您只能删除/添加一个方法而不会影响其他方法。

事件是具有安全约束的委托

  • 只能从保存事件的类中调用该事件
  • 只能从类外部注册/注销事件(仅+=/-=)
  • 不能将事件作为参数传递
  • 您只能从保存事件的类(eventName=null)中清除事件
离题:UnityEvent不是真正的事件,它是一个包含委托(操作)列表的类

调用事件(或委托)时,应始终检查空值,因为您永远不知道引用是否指向对象。UnityEvent不需要这个,因为正如我提到的,它不是真实事件,如果集合为空,则不会发生任何事情

public delegate void MyDel();
// The two following behaves the same
public MyDel myDel;
public Action myAction;

public event Action myEvent;

void Start(){
     if(myAction != null){ myAction(); }
     if(myEvent != null) { myEvent(); }
     if(myEvent != null) { myEvent.Invoke(); }
}
这些都是相同的事情,但选择一个还是另一个取决于你想做什么

在另一个类中考虑以下内容:

void Start(){
    refToClass.myAction = MyMethod;
    refToClass.myEvent += MyMethod;
}
void MyMethod(){}
第一种情况将删除附加到委托的所有方法,然后MyMethod是唯一剩下的侦听方法。 事件将不允许这样做,只允许+=/-=这样您只能删除/添加一个方法而不会影响其他方法。

委托基本上描述了函数类型。事件是一个钩子,当事件发生时,将调用与给定函数类型匹配的已注册函数

将这两个简化的定义放在一起,委托也是事件的描述符,因此,如果没有相关委托,就不能有事件

无论如何,您不会被迫为您声明的每个事件声明一个新委托。相反,您可以使用任何预先存在的委托,例如,甚至任何重载,选择最适合您的委托。

委托基本上描述函数类型。事件是一个钩子,当事件发生时,将调用与给定函数类型匹配的已注册函数

将这两个简化的定义放在一起,委托也是事件的描述符,因此,如果没有相关委托,就不能有事件

无论如何,您不会被迫为您声明的每个事件声明一个新委托。相反,您可以使用任何预先存在的委托,例如,甚至任何重载,选择最适合您的委托。

您所说的“我真的不需要委托”到底是什么意思?事件的类型必须是委托,因此不太清楚您的意思。您所说的“我真的不需要委托”到底是什么意思?事件的类型必须是委托,因此不太清楚您的意思。