您现在的位置是:首页 >其他 >UnityVR--EventManager--事件中心1网站首页其他

UnityVR--EventManager--事件中心1

唐小墨同学 2024-07-01 18:01:02
简介UnityVR--EventManager--事件中心1

目录

C#中的一些概念:

委托(Delegate)

事件(Event)

观察者模式

在项目中建立事件中心的必要


C#中的一些概念:

委托(Delegate)

  委托(Delegate)是一个数据类型(类),可以看作是一个方法的集合和管理器,用于对这些方法做一个流程化的管理。C#中的Delegate是强类型的,在声明委托时就已经指定了委托变量只能指向具有特定参数,以及返回值的方法。委托的声明如下:

Delegate void MyDelegate();

  可以无参也可以带参。如果带参,则在执行事件流程过程中,所有方法共用一个参数。定义了委托后,需要将被委托的方法集加入到委托中,如下:

MyDelegate myDelegate=new MyDelegate(Method1);
MyDelegate+=Method2;
MyDelegate+=Method3;

  委托的执行就是按顺序执行被委托的所有对象。Invoke()是用于同步调用委托对象的显示调用方法,或者隐式调用。如下。调用时就会将委托的方法Method1、Method2、Method3按顺序执行一遍。

myDelegate.Invoke(); //显示调用
myDelegate( );       //隐式调用

事件(Event)

 事件(Event)是特殊的委托,为委托提供了封装。它一方面允许从类的外部增加或删除绑定的方法,另一方面又不 允许从类的外部来触发,只能在事件源内部触发。它为委托对象隐式地建立add_XXX、remove_XXX两个方法,用作注册注销事件的处理方法。而且事件对应的变量成员将会被视为private变量,外界无法超越事件所在对象直接访问它们,这使事件具备良好的封装性。

  如下,在类中定义事件和触发事件的条件:

public delegate void MyDelegate(string name);

public class Manager
{   
   public event MyDelegate MyEvent;  //定义事件
   public void Execute(string name)
   {//管理触发事件的条件
      if (MyEvent != null) 
          MyEvent(name);    
   }   
}

  在事件中添加绑定方法并触发执行事件:

    class MyEvent
    {   
        Manager manager= new Manager();            
        Manager.MyEvent += new MyDelegate(Method); //绑定事件处理方法
        Manager.Execute("唐小墨同学");  //触发事件
    
        public static void Method(string name)
        {   
           // 写一些事件绑定的方法        
        }
     }

观察者模式

  属于行为型模式的一种,即建立一个或多个观察者去订阅或监听某一对象,当对象的行为触发事件时就会通知观察者,然后观察者执行相应的行为。详见设计模式(五)观察者模式_刘望舒的博客

  应用:在机械臂场景中的机械臂示教模式中,用到了Unity的UI控件,这些Button、Slider等控件都涉及到了事件监听的语句记录角度自动旋转,如下:

Button.onClick.Addlistener(recordAngle);

  就是给Button按钮添加一个观察者,一旦Button被按下,观察者就会被触发,从而回调recordAngle函数,去执行相应的工作。请注意,这句代码是写在Start中的,所以只要定义了一个事件的观察者,就不需要在Update()、FixedUpdate()中不断去刷新它,可以节约系统资源。

在项目中建立事件中心的必要

  以上的委托、事件、观察者模式,它们的作用其实是一致的,就是使代码的结构更加易读与合理,执行效率更高。否则需要写一长串的“if……else……”判断或者繁琐的过程性代码。因此,每个项目中都需要建立一个管理事件、回调等方法的事件中心,一旦发生鼠标移动(或者VR手柄输入)、键盘输入,或者在工业场景中发生触发传感器等任何事件时,都可以统一在事件中心进行管理,提高代码的重用性,最重要的是可以节约系统的运行资源。

  下一篇将实现一个事件中心示例

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。