【事件•语法篇】如何声明自定义的事件以及事件的完整/简略声明格式(附:事件...

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
///
/// 自定义事件
/// </summary>
public class OrderEventArgs:EventArgs
{
public string CoffeeName { get; set; }
public string CoffeeSize { get; set; }
public float CoffeePrice { get; set; }
}
/// <summary>
/// 事件的拥有者[类]----->Customer类
/// 事件[event关键字修饰]----->OnOrder,点餐事件
/// 时间的响应者[类]----->Waite类r
/// 事件处理器[方法-收到约束的方法]----->TakeAction方法
/// 事件的订阅关系[+=]----->+=
/// </summary>
public class Tra : MonoBehaviour
{
//规定:当委托是要实现某种事件时,命名为事件名+EventHandler--具有可读性,也可以约束改委托
//为OnOrder事件声明委托
public delegate void OrderEventHandler(Customer _customer, OrderEventArgs _e);
Customer customer = new Customer();
Waiter waiter = new Waiter();
// Start is called before the first frame update
void Start()
{
customer.OnOrder += waiter.TakeAction;//事件处理器
customer.Order();//事件拥有者的内部逻辑,触发事件
customer.PayTheBill();
}
public class Customer
{
public float Bill { get; set; }
public void PayTheBill()
{
Debug.Log("付"+Bill+"钱");
}
private OrderEventHandler orderEventHandler;
//申明事件
public event OrderEventHandler OnOrder
{
add
{
orderEventHandler += value;//添加事件处理器
}
remove
{
orderEventHandler -= value;
}
}
public void Order()
{
if(orderEventHandler!=null)
{
OrderEventArgs e = new OrderEventArgs();
e.CoffeeName = "abc";
e.CoffeeSize = "Grand";
e.CoffeePrice = 30;
orderEventHandler(this, e);
}
}
}
public class Waiter
{
internal void TakeAction(Customer _customer, OrderEventArgs _e)
{
float finalPrice = 0;
switch(_e.CoffeeSize)
{
case "Tall":
finalPrice = _e.CoffeePrice;//原价
break;
case "Grand":
finalPrice = _e.CoffeePrice + 3;
break;
case "Venti":
finalPrice = _e.CoffeePrice + 6;
break;
}
_customer.Bill += finalPrice;
}
}
}