目录
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
文章来源:https://www.toymoban.com/news/detail-470284.html
文章来源地址https://www.toymoban.com/news/detail-470284.html
到了这里,关于Unity---委托与事件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!