【Unity知识点】通俗解释delegate,事件event,Action,Func和UnityAction,UnityEvent

委托delegate

委托可以理解为像类一样,声明的一种方法类型。

委托对象可以被赋值,注册和注销方法。委托对象必须被赋值才可使用。委托的使用类内和类外无差别。

public delegate void MyDelegate(int i);
public MyDelegate myDelegate  ;
public void Start()
{
	//委托delegate
	myDelegate  = new MyDelegate(DoThing);
	myDelegate = DoThing;//等号赋值,更改委托内容
	myDelegate += DoThing;
	myDelegate -= DoThing;
	myDelegate.Invoke(1);
}

public void DoThing(int i)
{
	Debug.Log(i);
}

通过Invoke()调用delegate;

事件event

事件是对委托的一个限定,事件对象不需要被赋值,也不能被赋值,可以注册和注销方法。也可以注册和注销委托。

不论声明为public还是private,事件对象在类外只能在+=号和-=号的左边,意味着在声明此事件的类外,无法使用,只能注册和注销方法。

public delegate void MyDelegate(int i);
public MyDelegate myDelegate  ;
public event Mydelegate myEvent;
public void Start()
{
	//委托使用
	myDelegate  = new MyDelegate(DoThing);
	myDelegate= DoThing;//等号赋值,更改委托内容
	myDelegate += DoThing;
	myDelegate -= DoThing;
	
	//事件使用
	myEvent = DoThing; //在声明event的类中,可以为event赋值。
	myEvent = myDelegate;
	myEvent += DoThing;
	myEvent -=DoThing;
	myEvent += myDelegate;
	myEvent -=MyDelegate;
	myEvent.Invoke(1);
}

public void DoThing(int i)
{
	Debug.Log(i);
}

通过Invoke()调用event;

Action

Action和Func可以理解为系统定义好的带泛型的delegate。Action是无返回值的。

Action<T>的泛型T,代表参数。

从使用上就可以看出来;

public Action<int> action;

public void Start()
{
		action = DoThing;
		action += DoThing;
		action -= DoThing;
		action.Invoke(1);
}

public void DoThing(int i)
{
	Debug.Log(i);
}

Func

Action和Func可以理解为系统定义好的带泛型的delegate。Func是有返回值的。

Func<T,K>的前n-1个泛型代表参数, 最后一个泛型代表返回值类型。

public Func<int,int> action;

public void Start()
{
		action = DoThing;
		action += DoThing;
		action -= DoThing;
		int num = action.Invoke(1);
}

public int DoThing(int i)
{
	Debug.Log(i);
	return i+1;
}

如果向Func添加了多个不同方法,则返回值为最后添加的方法的返回值。

UnityAction

UnityAction是Unity对C#中Action的再次封装。是更适合在Unity中使用的一种泛型委托。

UnityAction对象可以用于Unity内的.AddListener()。

用法和Action一样。

public UnityAction<int> action;

public void Start()
{
		action = DoThing;
		action += DoThing;
		action -= DoThing;
		action.Invoke(1);
}

public void DoThing(int i)
{
	Debug.Log(i);
}

UnityEvent

UnityEvent可以在面板中添加监听事件,也可以在代码中添加监听事件或UnityAction。而且这两个模式不会互通。

 public UnityEvent<int> event0;
 public UnityEvent<int, string> event1;

他可以在Inspector面板显示,并且添加方法,就和Button按钮一样。
在这里插入图片描述
看起来是不是很眼熟?我们常用的UGUI中的Button点击事件,就继承自UnityEvent。

在Inspector中添加的事件,不受定义UnityEvent的参数限制,并且在代码中无法注销。(RemoveAllListeners无法注销在面板中设置的监听。)

Invoke的参数也只对代码中add的事件有效,在Inspector面板中添加的事件如果有参数,调用时使用面板设置的参数。

下面是UInityEvent在代码中的使用:

 public UnityEvent<int> event0;
 public UnityEvent<int, string> event1;

    void Start()
    {
        event0.AddListener(DoThing_Int);
        event1.AddListener(DoThing_Int_Str);
        
·		//只会注销在代码中add的Listener,面板定义的监听还保存在event0中
		event0.RemoveAllListeners();
		
        event0.Invoke(0);
        event1.Invoke(0, "zzz");
    }

    public void DoThing()
    {
        Debug.Log("DoThing");
    }
    public void DoThing_Int(int i)
    {
        Debug.Log("DoThing_Int"+ i);
    }
    public void DoThing_Int_Str(int i, string str)
    {
        Debug.Log("DoThing_Int_Str" + i+ str);
    }
Unity EventTrigger 可以在场景中添加事件,也可以在代码中动态添加事件。 以下是一个示例代码,演示如何动态添加 EventTrigger 事件。 ```csharp using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; public class AddEventTrigger : MonoBehaviour { // 添加的事件类型 public EventTriggerType eventType; void Start() { // 获取当前对象上的 EventTrigger 组件 EventTrigger eventTrigger = GetComponent<EventTrigger>(); // 如果 EventTrigger 为空,则添加该组件 if (eventTrigger == null) { eventTrigger = gameObject.AddComponent<EventTrigger>(); } // 创建一个新的 EventTrigger.Entry 条目,并为其添加回调函数 EventTrigger.Entry entry = new EventTrigger.Entry(); entry.eventID = eventType; entry.callback.AddListener((data) => { OnEventTriggered((PointerEventData)data); }); // 将新的 EventTrigger.Entry 条目添加到 EventTrigger 组件上 eventTrigger.triggers.Add(entry); } // 回调函数 void OnEventTriggered(PointerEventData data) { Debug.Log("Event Triggered: " + eventType); } } ``` 在上面的示例代码中,我们首先获取当前对象上的 EventTrigger 组件。如果该组件不存在,则添加该组件。 然后,我们创建一个新的 EventTrigger.Entry 条目,并为其添加回调函数。回调函数接收一个 PointerEventData 参数,该参数包含了事件的详细信息。 最后,我们将新的 EventTrigger.Entry 条目添加到 EventTrigger 组件上。这样,当指定的事件类型被触发时,回调函数就会被调用。 可以在 Unity Editor 中将该脚本添加到任意一个 GameObject 上,并设置 eventType 的值为所需的事件类型,然后运行游戏即可看到回调函数被触发的输出信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

真鬼123

祝你节节高升岁岁平安越来越漂亮

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值