首页 > 代码库 > c#事件Unity与.Net对比

c#事件Unity与.Net对比

今天在看Unity3d的书,发现上面的调用事件比较特殊,比如说按钮事件

该方法写在OnGUI方法中
if
(GUILayout.Button("按钮1")){  //执行事件的处理}

这样看上去,貌似UnityEngine帮我们把事件改成在OnGUI事件中的让我们自己去监听我们自己创建的控件,想想又想不通,

为什么这样做,于是我便在Console中写了一个闹钟类,模拟了下闹钟的响铃事件,代码如下:

using Microsoft.VisualStudio.DebuggerVisualizers;using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;namespace UnitTest{    /// <summary>    /// 事件参数类    /// </summary>    public class RingingEventArgs : EventArgs    {        public RingingEventArgs(DateTime dateTime)        {            Time = dateTime;        }        public readonly DateTime Time;    }    /// <summary>    /// 闹钟类    /// </summary>    public class Alarm    {        //设定的事件列表        private  List<DateTime> List=new List<DateTime>();        //增加闹钟的构造函数        public void Add(DateTime dateTime)        {            this.List.Add(dateTime);        }        //委托        public delegate void AlarmHandler(object sender, RingingEventArgs e);        //事件         public event AlarmHandler Ringing;        /// <summary>        /// 调用事件的方法        /// </summary>        /// <param name="eventArgs"></param>        protected virtual void OnRinging(RingingEventArgs eventArgs)        {            if (Ringing!=null)            {                Ringing(this, eventArgs);            }        }        /// <summary>        /// 闹钟监测方法        /// </summary>        public void CheckAlarm()        {            while (true)            {                foreach (DateTime dateTime in List)                {                    if (dateTime.ToString("yyyy-MM-dd hh:mm") == DateTime.Now.ToString("yyyy-MM-dd hh:mm"))                    {                        OnRinging(new RingingEventArgs(DateTime.Now));                    }                }            }        }    }}
       //调用检测闹钟方法,触发事件
static void Main(string[] args) { Alarm alarm=new Alarm(); alarm.Add(DateTime.Parse("2014-8-8 16:28")); alarm.Ringing+=alarm_Ringing; alarm.CheckAlarm(); } private static void alarm_Ringing(object sender, RingingEventArgs e) { Console.WriteLine("启用闹钟"+e.Time.ToShortTimeString()); Console.ReadLine(); }

从c#角度事件应该是委托来着,到了UnityEngine中这种方式挺不习惯