using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EventStudy : MonoBehaviour
{
/// <summary>
/// 这是用来实践事件的脚本
/// 了解委托与事件关系,事件的发布与订阅
/// </summary>
//声明一个事务
public delegate void HeroTrainHandler(string HreoName);
//自定义事件信息(继承EventArgs)主要用途是规范代码,便于自己或他人理解
public class HeroEventArgs : EventArgs
{
public Hero Hero { get; set; }
}
//发布器 英雄去锻炼自己
public class HeroTrainSender
{
//声明事件
public event HeroTrainHandler HeroTrains;
//声明事件本身
public void HeroTrain(string name)
{
if(HeroTrains != null)
{
HeroTrains.Invoke(name);
}
}
}
//声明订阅类
public class Hero
{
public string name;
public int battleNum = 1000;
//声明事件处理器
public virtual void Stronger(string name)
{
Debug.LogFormat(Time.realtimeSinceStartup + " 大英雄{0}开始锻炼,目前战斗力为:{1}", name, battleNum);
battleNum++;
Debug.LogFormat(Time.realtimeSinceStartup + " 大英雄{0}锻炼结束,目前战斗力为:{1}", name, battleNum);
}
}
//继承自Hero类的子类
public class Archer : Hero
{
public void Stronger(string name)
{
Debug.LogFormat(Time.realtimeSinceStartup + " 弓箭手{0}开始锻炼,目前战斗力为:{1}", name, battleNum);
battleNum++;
Debug.LogFormat(Time.realtimeSinceStartup + " 弓箭手{0}锻炼结束,目前战斗力为:{1}", name, battleNum);
}
}
HeroTrainSender sender = new HeroTrainSender();
Archer hero = new Archer { name = "林克" };
bool IsTraining = false;
// Start is called before the first frame update
private void Start()
{
sender.HeroTrains += hero.Stronger;
}
// Update is called once per frame
void Update()
{
StartCoroutine(HeroGrowUp(sender, hero));
}
//声明一个协程
public IEnumerator HeroGrowUp(HeroTrainSender sender, Hero hero)
{
if (!IsTraining)
{
IsTraining = true;
HeroEventArgs e = new HeroEventArgs { Hero = hero};
sender.HeroTrain(hero.name);
yield return new WaitForSeconds(3);
IsTraining = false;
}
}
}
效果如下:
事件的组成分为五个部分:
(1)事件发布者
(2)事件本身
(3)事件的订阅者:关注事件的对象.
(4)事件的处理:订阅者对于发布者的事件做出的回应.
(5)事件订阅:可以理解为事件发布者与事件订阅者如何联系的.