Unity-自定义事件派发器的两次尝试

🚀 优质资源分享 🚀

学习路线指引(点击解锁) 知识定位 人群定位
🧡 Python实战微信订餐小程序 🧡 进阶级 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
💛Python量化交易实战💛 入门级 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

一、前言:

在游戏开发的很多时候,需要引用其他类的方法,但是一旦类多起来了,相互引用会导致引用关系混乱,极其难以阅读。

以前初次做抖音小游戏时,和一位经验老道的cocos程序员合作,看到我写的代码他不禁皱起眉头,说我的引用关系太乱了,看不懂,但是他又不知道unity的事件派发器怎么写,就去网上找了一个。简直惊艳到我了。后来在现在公司做,又见到了一种事件派发器,于是心生感慨,模仿写了一个,并写博客记录一下。

二、现在做的事件派发器

1.声明对应的委托,此委托主要为事件用的。委托的所有返回类型都为Void,简化派发器的复杂程度;明确委托的方法参数类型,有几种类型就定义几种委托。

public delegate void VoidDelegate();
public delegate void BoolDelegate(params bool[] parameters);
public delegate void NumberDelegate(params float[] parameters);
public delegate void GameObjectDelegate(params GameObject[] parameters);

2.存储容器,用于存储事件

private static List GameStart\_List;

3.监听者,暴露给外部调用者的接口,对监听者的+=或-=对应容器里的Add和Remove

public static event VoidDelegate GameStart\_Listener
 {
 add
 {
 if(value != null)
 {
 if(GameStart\_List == null)
 {
 GameStart\_List = new List(1);
 }
 GameStart\_List.Add(value);
 }
 }
 remove
 {
 if(value != null)
 {
 for(int i = 0;i)
 {
 if(GameStart\_List[i] != null && GameStart\_List[i].Equals(value))
 {
 GameStart\_List.RemoveAt(i);
 break;
 }
 }
 }
 }
 }

4.派发者,因为event只能在声明类内部Invoke,所以需要暴露给外部调用者接口

public static void GameStart\_Dispatch()
 {
 if(GameStart\_List == null || GameStart\_List.Count <= 0)
 {
 return;
 }
 for(int i = 0;i < GameStart\_List.Count;i++)
 {
 GameStart\_List[i]?.Invoke();
 }
 }

5.上文可看见我的事件叫GameStart,那么我想新增一个GameEnd的事件,岂不是又要写一遍?而且假如我的方法参数是float呢?是bool呢?是GameObject呢?岂不是改动很大?所以我在Unity做了一个自动生成事件的工具

5.1 定义ScriptObject作为配置文件,可随时修改以添加或者删除事件

[CreateAssetMenu]
public class EventHandlerSetting:ScriptableObject
{
 public List types;
 public List items;
}

[System.Serializable]
public class EventItem
{
 public string eventName;
 public string typeName;
}

[System.Serializable]
public class EventType
{
 public string typeName;
 public string typeDelegate;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值