今天在看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中这种方式挺不习惯