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)事件订阅:可以理解为事件发布者与事件订阅者如何联系的.

本文介绍了一个Unity中的事件系统实现案例,通过自定义事件处理器和事件发布机制,展示了如何使用委托来实现事件的订阅与发布。具体包括事件发布者、事件本身、事件订阅者及其处理流程。
933

被折叠的 条评论
为什么被折叠?



