我们打开上一篇42怪物的有限状态机的项目,
本章要做的事情是利用事件中心(和观察者模式相仿)将Update()函数中写的GameObject.Find()这些语句替换掉,因为在Update()函数中每帧的执行频率非常快,如果在Update()函数中写GameObject.Find()语句特别消耗性能,本章主题意义在于利用事件中心优化脚本代码,提升项目质量
首先创建脚本:IEventInfo.cs
cs
using UnityEngine;
//事件的存储与管理 订阅者
public class IEventInfo : MonoBehaviour{
}
创建脚本:EventInfo.cs
cs
using UnityEngine.Events;
//事件的存储与管理 订阅者
public class EventInfo : IEventInfo {
public UnityAction actions;
public EventInfo(UnityAction actions){
this.actions += actions;
}
}
public class EventInfo<T> : IEventInfo {
public UnityAction<T> actions;
public EventInfo(UnityAction<T> action){
actions = action;
}
}
创建脚本:EventCenter.cs
cs
using System.Collections.Generic;
using UnityEngine.Events;
//中介者
public class EventCenter : Singleton<EventCenter>{
//存储事件列表
Dictionary<string,IEventInfo> eventDic = new Dictionary<string,IEventInfo>();
//订阅消息
public void AddEventListener(string name, UnityAction action) {
if (eventDic.ContainsKey(name)){
(eventDic[name] as EventInfo).actions += action;
}
else {
eventDic.Add(name, new EventInfo(action));
}
}
//通知消息
public void EventTrigger(string name) {
if (eventDic.ContainsKey(name)) {
if ((eventDic[name] as EventInfo).actions != null) {
(eventDic[name] as EventInfo).actions.Invoke();
}
}
}
public void RemoveEventListener(string name, UnityAction action) {
if (eventDic.ContainsKey(name)) {
(eventDic[name] as EventInfo).actions -= action;
}
}
//添加带参数事件的监听
public void AddEventListener<T>(string name, UnityAction<T> action){
//旧事件
if (eventDic.ContainsKey(name)){
(eventDic[name] as EventInfo<T>).actions += action;
}
//新事件
else{
eventDic.Add(name, new EventInfo<T>(action));
}
}
//移除带参数事件的监听
public void RemoveEventListener<T>(string name, UnityAction<T> action){
if (eventDic.ContainsKey(name)){
(eventDic[name] as EventInfo<T>).actions -= action;
}
}
//分发带参数的事件
public void EventTrigger<T>(string name,T info){
if (eventDic.ContainsKey(name)){
if ((eventDic[name] as EventInfo<T>).actions != null){
(eventDic[name] as EventInfo<T>).actions.Invoke(info);
}
}
}
public void Clear() {
eventDic.Clear();
}
}
修改脚本:PlayerRayClickNavigation.cs
修改脚本:
运行项目 - 功能不变没有报错
本章利用事件中心(与观察者模式相仿)替换掉了Update()函数中的GameObject.Find()语句提升项目质量
接下来的内容:
1.战士职业平A(按A键)使怪物掉血的功能
2.窗口可拖拽脚本
3.点击名称寻找地点功能
4.隐藏怪物的生成
5.怪物I攻击范围内的主动攻击
6.掉落坐骑蛋的获取
7.异步传送转换场景
以及开放回合制、坐骑系统、宠物系统、背包系统、神炼系统、商城系统、Boss的目标跟随任务导航系统以及UI播放3D动画效果等等。
具体项目运行效果请关注water1024的b站视频项目演示《破碎纪元》