Action UnityAction与event UnityEvent

本文详细介绍了Unity中Action和UnityEvent的使用方法及区别。Action用于简单的回调功能,而UnityEvent允许一对多的通知机制,适用于游戏开发中的事件管理和消息传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 Action是基于委托,并且无返回值。可带参数Action<T1,T2,T3,T4>。通常大家可以用在订阅事件和发出消息结合。这点和delegate配合event很相似。它们在程序运行时[动态绑定]

class MyClass:MonoBehavior
{
  public delegate void MyDelegate();
  public event MyDelegate eventHandler;
  //对所有订阅过该事件的订阅者发消息
  public  void  SendMessage()
  {
    if(eventHandler!=null)
    {
     eventHandler();
    }
  }
}
 
class MyTest:MonoBehavior
{
  public system.Action callBack;  
  void Start()
  {
   callBack=MyFunction; 
  }
  void MyFunction()
  {
   //...
  } 
  //此过程等于调用MyFunction函数。可以是其他类的函数
  public void SendMessage()
  {
    this.callBack();
  }
  
}
 

 

从上面可以看出Action等于传递了一个函数,不同于普遍使用的传数据类型,传类

 

UnityAction与UnityEvent

   既然event可以方便的传递消息,那Unity开发者自然也有自己的UnityEvent。比如简单Button使用的时候,我们把对象拖入Runtime中,然后选择我们所需要的调用函数。其实使用的就是Runtime里的UnityEvent,这里的拖入完成的就是注册

  在我们的类中声明如下,并作序列化

 

可以在Inspector面板看到

 

 

和Button有点相似

 

说到这里那UnityAction呢?其实它和Action一样,都需要绑定对应的函数。UnityEvent里也需要注册UnityAcrtion.这样当我们调用UnityEvent的Invoke方法后,它会对所有注册过的UnityAction发出回调。例如

 

 

using UnityEngine;
using System.Collections;
using UnityEngine.Events;
public class UnityActionAndEvent : MonoBehaviour {
 
    public UnityAction action;
    public UnityEvent myEvent = new UnityEvent();
 
    void Start()
    {       
        action = new UnityAction(MyFunction);
        action+=MyFunction2;
        myEvent.AddListener(action);
 
        //AddListener的时候也可采用匿名委托,省去UnityAction
        myEvent.AddListener(()=>
        {
         //此处等于一个函数体,要处理的逻辑 
        }  
    );
         
    }
    void Update()
    {
        if(Input.GetKeyDown(KeyCode.Space))
        {
            myEvent.Invoke();
        }
    }
    public void MyFunction()
    {
        print ("MyFunction");
    }
    public void MyFunction2()
    {
        print ("MyFunction2");
    }
}
 

 

UnityEvent<T0> 是抽象类,需要继承。

 

public class MyEvent:UnityEvent<int>{}
 
public class UnityActionWithParameter : MonoBehaviour {
 
    public MyEvent myEvent = new MyEvent();
    public UnityAction<int> action;
 
    void Start () {
        action= new UnityAction<int>(MyFunction);
        action += MyFunction2;
        myEvent.AddListener(action);
    }   
    void Update () {
        if(Input.GetKeyDown(KeyCode.A))
        {
            myEvent.Invoke(10);
        }
    }
    public void MyFunction(int i)
    {
        print (i);
    }
    public void MyFunction2(int i)
    {
        print(i*2);
    }
}
 

如果说使用Action可以完成简单回调一对一使用的话,那么通过UnityEvent则可以完成对所有注册过的UnityAction实现一对多通知。

 

原文地址:https://blog.youkuaiyun.com/LinZhonglong/article/details/81131097

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值