🚀 优质资源分享 🚀
学习路线指引(点击解锁) | 知识定位 | 人群定位 |
---|---|---|
🧡 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;
}