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

原文地址:https://www.cnblogs.com/anbylau2130/p/3899783.html