Unity---委托与事件

目录

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

猜你喜欢

转载自blog.csdn.net/lalate/article/details/130954407