c#事件Unity与.Net对比

时间:2023-03-09 19:24:06
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中这种方式挺不习惯