精华内容
下载资源
问答
  • UnityAction和UnityEvent

    2020-07-16 17:14:33
    UnityAction和UnityEvent using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; public class UnityEventTest : MonoBehaviour { public UnityAction ...

    UnityAction和UnityEvent

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.Events;
    
    public class UnityEventTest : MonoBehaviour
    {
    
        public UnityAction myAction;
        public UnityEvent myEvent;
    
        private void Start()
        {
            //添加监听方法1:将myAction和SendEvent1方法绑定
            myAction = new UnityAction(SendEvent1);
    
            //添加监听方法2:将myAction和SendEvent2方法绑定
            myAction += SendEvent2;
    
    
            //为Event添加监听者myAction
            myEvent.AddListener(myAction);
    
            //lamda表达式
            myEvent.AddListener(() =>
                    {
                        LamdaEvent(1, 2);
                    }
                );
        }
    
    
        void SendEvent1()
        {
            Debug.Log("new出来的UnityAction事件");
        }
    
        void SendEvent2()
        {
            Debug.Log("+=的监听事件");
        }
    
        public void SendEvent3()
        {
            Debug.Log("在面板上挂载的事件");
        }
    
        public void LamdaEvent(int i, int j)
        {
            Debug.Log("输出的是" + i + "和" + j);
        }
    
        private void Update()
        {
            if (Input.GetKeyDown(KeyCode.Space))
            {
                //触发myEvent事件
                myEvent.Invoke();
            }
        }
    
    }
    
    

    将此脚本挂载到GameObject上会出现这个面板:
    UnityEvent
    是不是很眼熟呢,这个就是UGUI中的Button点击事件会用到的UnityEvent事件系统。

    在脚本中申明了UnityAction和UnityEvent两个类型的字段,UnityEvent相当于是发起了一个消息,而UnityEvent监听了UnityAction这个监听者,而Action又可以被SendEvent1和SendEvent2两个方法所监听,在代码中分别使用了两种方法进行监听绑定。一种就是直接new一个UnityAction出来,另外一种就是使用C#中的委托机制+=方法进行绑定。还有另外的一种绑定方法,就是在上图面板上点击加号,手动绑定公开的方法,就是跟绑定鼠标点击事件一样的方式。

    最后要介绍的是UnityEvent监听的lamda表达式,用lamda表达式可以更方便自由得传入参数,添加更多逻辑。

    虽然介绍了几种使用方式,但如何能更好的使用到项目中还是得好好思考一番。

    展开全文
  • PS:最近看到有很多地方用到UnityAction和UnityEvent的地方,自己也刚刚学习,总结一下 Action 与event Action也是基于委托,并且无返回值。可带参数Action<T1,T2,T3,T4>。通常大家可以用在订阅...

    PS:最近看到有很多地方用到UnityAction和UnityEvent的地方,自己也刚刚学习,总结一下

    Action 与event 

       Action也是基于委托无返回值,可带参数Action<T1,T2,T3,T4>

    UnityAction与UnityEvent

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

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

    可以在Inspector面板看到

    调用UnityEvent的Invoke方法后,它会对所有注册过的UnityAction发出回调

    PS:欢迎一起交流学习

    展开全文
  • UnityEvent和UnityAction

    2017-08-07 11:02:11
    UnityAction本质上是delegate,且有数个泛型版本(参数最多是4个),一个UnityAction可以添加多个函数(多播委托) UnityEvent本质上是继承自UnityEventBase的类,它的AddListener()方法能够注册UnityAction,...


    1. UnityAction本质上是delegate,且有数个泛型版本(参数最多是4个),一个UnityAction可以添加多个函数(多播委托)

    2. UnityEvent本质上是继承自UnityEventBase的类,它的AddListener()方法能够注册UnityAction,RemoveListener能够取消注册UnityAction,还有Invoke()方法能够一次性调用所有注册了的UnityAction。UnityEvent也有数个泛型版本(参数最多也是4个),但要注意的一点是,UnityAction的所有带参数的泛型版本都是抽象类(abstract),所以如果要使用的话,需要自己声明一个类继承之,然后再实例化该类才可以使用。

    3. UnityEvent<T0>是抽象类,但是UnityEvent不是抽象类,可以创建对象

    4. Unity中通过面板中添加的Listener和通过脚本添加的Listener实际上是两种不同类型的Listener:

      在脚本中通过AddListener()添加的是一个0个参数的delegate(UnityAction)回调。是不可序列化的,在Inspector中是无法看到的。这种Listener是常规Listener。

      在Inspector中添加的则是永久性的Listener(persistent listener)。他们需要指定GameObject、方法以及方法需要的参数。他们是序列化的,用脚本是无法访问到的


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    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);
         }
     
         void  Update()
         {
             if  (Input.GetKeyDown(KeyCode.P))
             {
                 myEvent.Invoke();
             }
         }
     
         public  void  MyFunction()
         {
             print( "Hello: " );
         }
     
         public  void  MyFunction2()
         {
             print( "Hello2: " );
         }
     
    }



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    using  UnityEngine;
    using  System.Collections;
    using  UnityEngine.Events;
     
    //因为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);
         }
    }

    展开全文
  • 1,UnityAction本质上是delegate,且有数个泛型版本(参数最多是4个),一个UnityAction可以添加多个函数(多播委托) 2,UnityEvent本质上是继承自UnityEventBase的类,它的AddListener()方法能够注册UnityAction,...

    1,UnityAction本质上是delegate,且有数个泛型版本(参数最多是4个),一个UnityAction可以添加多个函数(多播委托)

    2,UnityEvent本质上是继承自UnityEventBase的类,它的AddListener()方法能够注册UnityAction,RemoveListener能够取消注册UnityAction,还有Invoke()方法能够一次性调用所有注册了的UnityAction。UnityEvent也有数个泛型版本(参数最多也是4个),但要注意的一点是,UnityAction的所有带参数的泛型版本都是抽象类(abstract),所以如果要使用的话,需要自己声明一个类继承之,然后再实例化该类才可以使用。
    示例:
    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);
    }
    
    void Update()
    {
        if(Input.GetKeyDown(KeyCode.P))
        {
            myEvent.Invoke();
        }
    }
    
    public void MyFunction()
    {
        print ("Hello: ");
    }
    
    public void MyFunction2()
    {
        print ("Hello2: ");
    }
    

    }

    展开全文
  • UnityAction和System.Action引发的思考

    千次阅读 2018-04-05 01:07:59
    今天突然发现UnityAction,这是什么,怎么和Action有着类似的功能?可是如果功能如果真的一致,那unity官方提供这个不是多此一举吗。 在google的帮助下我得到了答案。(百度真是垃圾) UnityAction和System.Action...
  • 当有许多个按钮需要添加监听的时候,我们可以先使用UnityAction把这些方法监听起来,再分别传给按钮。 public UnityEngine.Events.UnityAction[] allEvents = new UnityEngine.Events.UnityAction[3]; ...
  • UnityAction本质上是delegate,且有数个泛型版本(参数最多是4个),一个UnityAction可以添加多个函数(多播委托) UnityEvent本质上是继承自UnityEventBase的类,它的AddListener()方法能够注册UnityAction,...
  • UnityAction本质上是delegate,且有数个泛型版本(参数最多是4个),一个UnityAction可以添加多个函数(多播委托) UnityEvent本质上是继承自UnityEventBase的类,它的AddListener()方法能够注册UnityAction,...
  • Unity自己封装了一套委托机制。。。怎么说呢,我觉得效率什么的应该不会比直接写委托强(虽然没有测过)。...具体UnityAction和UnityEvent与Action和Event的区别可以看这里https://blog.csdn.net/qq_3424...
  • UnityAction是 void的带一个参数的委托 UnityEvent是对UnityAction的封装 Addlistener相当于+= Remove相当于-= EventTrigger是一个实现了所有点击拖拽等等接口的组件 添加了他就等于实现了所有接口。 但是他的...
  • 本部分介绍XLua中添加泛型类型的UnityAction导出. ????具体方法 在XLua的配置文件中, 如ExampleConfig.lua中, 找到CSharpCallLua列表(public static List CSharpCallLua), 在其中添加需要的类型, 如: [CSharpCallLua...
  • Action UnityAction与event UnityEvent

    千次阅读 2018-12-28 11:55:48
    Action是基于委托,并且无返回值。可带参数Action&lt;T1,T2,T3,T4&gt;。通常大家可以用在订阅事件和发出消息结合。这点和delegate配合event很相似。它们在程序运行时[动态绑定] class MyClass:MonoBehavior...
  • 1、委托 2、EventTrigger public class UDC_Lg : ...UnityAction callback; void Start() { callback = new UnityAction(OnScriptControll); AddPointClick(callback); } public void Debugs() { Debug.Lo...
  • delegate、Func、Action、event、UnityEvent、UnityAction 委托 一种可用于封装命名或者匿名方法的引用类型。 它的存在说明变量不仅能存储值,对象的引用,还能存方法。只不过声明时前面加个delegate。与函数指针...
  • 介绍:1.0 使用的EventTrigger使用事件触发进行监听事件 2.0 UnityAction&lt;T&gt;这是一个泛型委托,用来将方法注册进去; 3.0 我们可以在UnityEvent中使用AddListener()方法注册UnityAction&lt;T&...
  • unity3d UnityAction多参数调用

    千次阅读 2017-04-26 09:36:25
    using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class NewBehaviourScript2 : MonoBehaviour { private Button button;... void Start () {
  • public class UnityActionAndEvent : MonoBehaviour { public UnityAction action; public UnityEvent myEvent = new UnityEvent(); void Start() { action = new UnityAction(MyFunction); action += MyFunction2;...
  • else if(reply.upcomingEventsItem.Count > 0) { Debug.Log("reply.buyPackage == null 或 this.eventsReply == null"); UpComingBuffer.GetInstance().UpComingEventList = reply.upcomingEventsItem;...
  • C#的抽象类及接口设计蛮奇怪。先说抽象类,抽象类允许抽象方法,也允许不抽象的方法。额外一提,当你使用子类去继承基类完成方法重写时,千万要...另一方面,由于要设计一个运行于Unity的Http请求解析类(使用WWW类)
  • Unity Button Action是从Zinnia.Unity Action派生而来的,因此可以注入需要初始化动作(例如,指针激活)的任何VRTK预制件中。 VRTK带有一些预制的预制件,其中包含用于OpenVR和Oculus控制器的通用按钮映射。 有用的...
  • Unity in Action - Covers Unity 5 英文mobi 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
  • Unity 事件整理

    2020-07-22 11:08:16
    1.UnityAction本质上是delegate,且有数个泛型版本(参数最多是4个),一个UnityAction可以添加多个函数(多播委托) 2.UnityEvent本质上是继承自UnityEventBase的类,它的AddListener()方法能够注册UnityAction,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,733
精华内容 5,093
关键字:

unityaction