目录
1.委托和事件在使用上的区别是什么?
2. delegate委托
2.1示意图
2.2 DelegetTest.cs
2.3 Deleget_A.cs
2.4 Deleget_B.cs
2.5 运行unity. 点击按键 A
2.6 点击按键 B
3.Event 事件
3.1单个通知
3.1.1示意图
3.1.2 Event_Test.cs
3.1.3 Event_A.cs
3.1.4 运行 点击按键A
3.2多个通知
3.2.1示意图
3.2.2 Event_Test.cs
3.2.3 Event_A.cs
3.2.4 Event_B.cs
3.2.5 运行 点击按键A
1.委托和事件在使用上的区别是什么?
 委托和事件是C#中的重要概念,通俗来讲,委托是一个可以指向特定方法的指针,可以将委托分配给不同的脚本,使它们能够完成不同的任务。而事件则是一种使用委托实现的通知机制,它告诉委托需要执行任务了。因此,委托定义了任务,而事件则是通知委托执行任务的通知。在 Unity 中,通过使用委托和事件,可以实现诸如响应按钮点击,处理游戏碰撞等功能。
它们在使用上的不同:
 定义:委托是一种类型,它可以引用方法。事件是一种基于委托的机制,允许在事件发生时通知多个对象。
用法:委托是一种低级机制,可以直接调用关联的方法。事件则是一种高级机制,它可以被订阅和取消订阅,并在事件发生时引发通知。
安全性:委托是一种不安全的机制,它允许直接访问关联的方法,这可能会导致错误。事件则是一种安全的机制,它只允许通过订阅和取消订阅来访问关联的方法,因此不存在安全风险。
总之,委托是C#中的一种低级机制,它可以直接调用关联的方法,但可能带来安全问题;事件则是一种高级机制,它是基于委托的,允许在事件发生时通知多个对象,并且更加安全。
2. delegate委托
2.1示意图
层级面板:

属性面板:
 
 
 
如图,三个脚本分别挂载到三个物体上
2.2 DelegetTest.cs
using UnityEngine;
public delegate void Call(string type);
public class DelegetTest : MonoBehaviour
{
    public static Call call;
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            call("a");
        }
        if (Input.GetKeyDown(KeyCode.B))
        {
            call("b");
        }
    }
} 
2.3 Deleget_A.cs
using UnityEngine;
public class Deleget_A : MonoBehaviour
{
    private string type = "a";
    private void Awake()
    {
        DelegetTest.call += BeCalled;
    }
    private void BeCalled(string msg)
    {
        Debug.LogError(type + "接收到呼叫");
        if (msg.Equals(type))
        {
            Debug.LogError("a 开始做事");
        }
    }
} 
2.4 Deleget_B.cs
using UnityEngine;
public class Deleget_B : MonoBehaviour
{
    private string type = "b";
    private void Awake()
    {
        DelegetTest.call += BeCalled;
    }
    private void BeCalled(string msg)
    {
        Debug.LogError(type + "接收到呼叫");
        if (msg.Equals(type))
        {
            Debug.LogError("b 开始做事");
        }
    }
} 
2.5 运行unity. 点击按键 A

2.6 点击按键 B

3.Event 事件
3.1单个通知
3.1.1示意图
层级面板:
 
属性面板:

 
3.1.2 Event_Test.cs
public class Event_Test : MonoBehaviour
{
    public event EventHandler<Event_A> eventCall;
    [SerializeField]
    private Event_A eventA;
    private void Awake()
    {
        eventCall += Call;
    }
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            eventCall.Invoke(this, eventA);
        }
    }
    private void Call(object obj, Event_A e_a)
    {
        Debug.LogError(e_a.args);
        e_a.DoSomething();
    }
} 
3.1.3 Event_A.cs
using UnityEngine;
public class Event_A : MonoBehaviour
{
    public string args = "我是脚本A";
    public void DoSomething()
    {
        Debug.LogError("脚本A在做事");
    }
} 
3.1.4 运行 点击按键A

3.2多个通知
3.2.1示意图
层级面板:

属性面板:

 
 
3.2.2 Event_Test.cs
using System;
using UnityEngine;
public class Event_Test : MonoBehaviour
{
    public event EventHandler eventCall;
    [SerializeField]
    private Event_A eventA;
    [SerializeField]
    private Event_B eventB;
    private void Awake()
    {
        eventCall += eventA.Call;
        eventCall += eventB.Call;
    }
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            eventCall.Invoke(this, EventArgs.Empty);
        }
    }
} 
3.2.3 Event_A.cs
using System;
using UnityEngine;
public class Event_A : MonoBehaviour
{
    public string _name = "aaa";
    public void DoSomething()
    {
        Debug.LogError("脚本A开始做事");
    }
    public void Call(object obj, EventArgs args)
    {
        Debug.LogError(_name);
        DoSomething();
    }
} 
3.2.4 Event_B.cs
using System;
using UnityEngine;
public class Event_B : MonoBehaviour
{
    public string _name = "bbb";
    public void DoSomething()
    {
        Debug.LogError("脚本B开始做事");
    }
    public void Call(object obj, EventArgs args)
    {
        Debug.LogError(_name);
        DoSomething();
    }
} 
3.2.5 运行 点击按键A



















