C# 事件(Event)学习记录

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值